记一次凯撒加密程序的开发


前情提要


之前了解了一些python ascii码的知识,又联想到了加密,于是就出现了这个小程序
“OhMyPSW“
这是一款基于python制作的 以凯撒加密为核心算法 的密码记事本,这是我第一个初具规模的项目,而且是完全开源的
接下来,我将会向大家详细介绍我的程序
(ps:我还使用相同的技术做了一个加密聊天的程序,目前还处于测试阶段,日后将会出现!)

———基本技术详解———

什么是凯撒加密

凱撒密碼(英語:Caesar cipher),或稱凱撒加密、凱撒變換、變換加密,是一種最簡單且最廣為人知的加密技術。凱撒密碼是一種替換加密技術,明文中的所有字母都在字母表上向後(或向前)按照一個固定數目進行偏移後被替換成密文。例如,當偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。



凯撒加密,说白了就是把字母按照一定的顺序替换,最初我设想的方案是制作一个字母表格,每个字母编上序号,通过对序号的加减实现替换,并且当时实现了一定的预想效果

但是随后我在对中文的适配时遇到了问题,中文的汉字太多了!,一个个进行编码根本不现实,而且不能使用特殊字符(虽然应该不会有什么人用中文设置密码吧),但是为了以后做其他的项目 也能更好的适配,所以我选择攻破这个难关: 更换算法

其实无论对语言怎样处理,本质上都是数字化,所以我灵机一动(实际上是在大佬的帮助下)想到用ASCII码来代替,所有的字符,只要能在计算机上显示,就必定会有一个属于自己的ASCII码,而且这个数值是可以进行加减计算来实现换位的!!!

———基本功能实现———


python中的命令

    ord(明文) #将明文变为ascii码
    chr(ascii码)#将ascii变为明文
有了这基本的指令,就可以 广阔天地,大有作为了!

 ————各版本介绍————

 0.5版本(不发行,想看也看不到)


    #将明文生成密文
    safe_data_1='' #明文
    for s in data:
        a=ord(s)#将明文中每个 字母/汉字/数字 导入到算法中进行转ascii
        b=a+key#将明文中每个 字母/汉字/数字 的ascii  加上key变为明文
        safe_data_1=safe_data_1+chr(b)#替换原字符串-加密完成!
        
    #解密为原文(tire1-data)
    for y in safe_data_1:
        n=ord(y)-key
        n=chr(n)
        data=data+n

没错,刚刚你看到的这几行代码,就是我们OhMyPSW的最底层算法,很简单对吧! 我的0.5版本就是以此为基础制作的(当时只能实现最基础的加密解密功能,不能进行存储)

1.0版本(不公开发出,看到算你的运气)


为了解决不能存储的问题,在1.0版本中我们将会更新用于将密码本存储和读写的代码,这相对来说很基础,也有不少比我更厉害的大佬教过,我就直接放代码好了

以下是重点更新内容

    #存储
    data = open('此处放文件路径 绝对相对均可','a')  #这里的a代表权限为 只写
    data.write(str(netname2))
    data.write(str(username2))
    data.write(str(password2))   #存储的这三个变量其实就是加密后的描述,用户名,密码
    data.write('\n')   #此处是为了换行,其实应该有更好的方法,这里就是单纯为了简单
    #读取
    data = open('此处放文件路径 绝对相对均可,'r')   #r代表权限为 只读
    file=str(data.read()) #逐行读取

2.0版本(第一个公开发出的版本,感谢支持)


在这个版本中进一步增强了安全性,考虑到暴力破解的可能,我又对凯撒加密的密码进行了倒序排列,简单表示如下:

abc - def -fed

这样可以有效地防止暴力破解

这个版本原始文件找不到了,放在2.5版本一起发出吧,反正2.5版本改动不大

2.5版本


增加自动生成高强度密码

上代码!

    import random
    import time
    
    def code_append(key):
        a=1
    
        while a >0:
            netname1=str(input('请输入域名/软件描述:'))
            username1=str(input('请输入账号名:'))
            password1=input('请输入密码:')
            a=a-1
        
        #对密码进行加密
        password2=''
        for s in (password1+'\n'):
            a=ord(s)
            b=a+key
            password2=password2+chr(b)


        #对描述进行加密
        netname2=''
        for s in (netname1+'_'):
            a=ord(s)
            b=a+key
            netname2=netname2+chr(b)


        #对用户名进行加密
        username2=''
        for s in (username1+'_'):
            a=ord(s)
            b=a+key
            username2=username2+chr(b)



        #存储到文件里
        data = open('Net_Code/data.txt','a')
        data.write(str(netname2))
        data.write(str(username2))
        data.write(str(password2))
        data.write('\n') #此处是为了换行,其实应该有更好的方法,这里就是单纯为了简单




    def code_look(key):
        data = open('Net_Code/data.txt','r')
        file=str(data.read())
        file2=''
    
        for y in file:
            n=ord(y)-key
            n=chr(n)
            file2=file2+n
        
        file2.replace('__', '\n')
        print(file2)




    def code_append_ai(key):
        x=1
        while x>0:
            netname1=str(input('请输入域名/软件描述:'))
            username1=str(input('请输入账号名:'))
            password0=random.sample('''qwertyuiop/asdfghjklzxcvbnm/1234567890-=!@#$12)
            #print(password0)
            #列表转字符串
            password1=''
            for i in password0:
                password1=password1+str(i)
            print('请牢记您的密码'+password1)
            time.sleep(3)
            x=x-1


​        
​        
        #对密码进行加密
        password2=''
        for s in (password1+'\n'):
            a=ord(s)
            b=a+key
            password2=password2+chr(b)


        #对描述进行加密
        netname2=''
        for s in (netname1+'_'):
            a=ord(s)
            b=a+key
            netname2=netname2+chr(b)


        #对用户名进行加密
        username2=''
        for s in (username1+'_'):
            a=ord(s)
            b=a+key
            username2=username2+chr(b)



        #存储到文件里
        data = open('Net_Code/data.txt','a')
        data.write(str(netname2))
        data.write(str(username2))
        data.write(str(password2))
        data.write('\n') #此处是为了换行,其实应该有更好的方法,这里就是单纯为了简单


​        
​            
    def show(x):
        while int(x) !=0:
            print(hello)
            x=int(x-1)

3.0版本(目前最新版本)


增加了GUI图形化界面,但是个人觉得做的不是很完全,部分功能还是需要命令行

本人gui用的很少,所以会有很多奇奇怪怪的注释,望见谅!

先放出源码,可以先看看,针对 win和macos系统 可执行文件 的打包和部署教程 正在制作中,稍安勿躁

    from cProfile import label
    from ctypes import c_int
    from dataclasses import dataclass
    from email import message
    from email.mime import image
    from re import T
    import tkinter as tk
    import random
    import time
    import tkinter.messagebox



    data_point='psw_data.txt'#根目录位置
    
    def show():
        key=int(entry_usr_pwd.get())
        data = open(data_point,'r')
        file=str(data.read())
        file2=''
    
        for y in file:
            n=ord(y)-key
            n=chr(n)
            file2=file2+n
        
        file2.replace('__', '\n')
        window_show_output.insert('insert',file2)
    
    #def clean():
        #window_show_output.delete('1.0','end')
    
    def code_append():
        window_show_output.delete('1.0','end')
        key=int(entry_usr_pwd.get())
        a=1
        while a >0:
            netname1=str(input('请输入域名/软件描述:'))
            username1=str(input('请输入账号名:'))
            password1=input('请输入密码:')
            a=a-1
        
        #对密码进行加密
        password2=''
        for s in (password1+'\n'):
            a=ord(s)
            b=a+key
            password2=password2+chr(b)


        #对描述进行加密
        netname2=''
        for s in (netname1+'_'):
            a=ord(s)
            b=a+key
            netname2=netname2+chr(b)


        #对用户名进行加密
        username2=''
        for s in (username1+'_'):
            a=ord(s)
            b=a+key
            username2=username2+chr(b)



        #存储到文件里
        data = open(data_point,'a')
        data.write(str(netname2))
        data.write(str(username2))
        data.write(str(password2))
        data.write('\n') #此处是为了换行,其实应该有更好的方法,这里就是单纯为了简单
    
    def code_append_ai():
        window_show_output.delete('1.0','end')
        key=int(entry_usr_pwd.get())
        x=1
        while x>0:
            netname1=str(input('请输入域名/软件描述:'))
            username1=str(input('请输入账号名:'))
            password0=random.sample('''AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890@#¥%''',12) #此处还有问题,下个版本应当支持自定义
            #列表转字符串
            password1=''
            for i in password0:
                password1=password1+str(i)
            print('请牢记您的密码'+password1)
            time.sleep(3)
            x=x-1

        #对密码进行加密
        password2=''
        for s in (password1+'\n'):
            a=ord(s)
            b=a+key
            password2=password2+chr(b)


        #对描述进行加密
        netname2=''
        for s in (netname1+'_'):
            a=ord(s)
            b=a+key
            netname2=netname2+chr(b)


        #对用户名进行加密
        username2=''
        for s in (username1+'_'):
            a=ord(s)
            b=a+key
            username2=username2+chr(b)



        #存储到文件里
        data = open(data_point,'a')
        data.write(str(netname2))
        data.write(str(username2))
        data.write(str(password2))
        data.write('\n') #此处是为了换行,其实应该有更好的方法,这里就是单纯为了简单
    
    def readme():
        window_show_output.delete('1.0','end')
        text='''
    以下是帮助手册
    GitHub链接:https://github.com/MRX-J0BS/Net_Code'
    --如何确定主密钥--
    在您第一次登录时,请在左侧的 ‘password’输入栏输入一个主密钥(这就是换位加密的关键值)
    并且请您牢记此密码,一旦丢失那么您的所有密码将会无法复原(很难)
    
    注:user name模块现在还没有正式调试完成,不用管
    
    --关于安全性--
    网络安全很重要!希望大家不要仅仅注意密码存储的是否安全,90%的密码都是被窃取的而非盗取(不过请相信我不会倒去您的密码,因为这个程序是完全不联网的)
    我们的密码使用了凯撒算法加密,虽然一个加密软件公开自己的算法会很危险,但是我觉得您有这个知情权和选择的权利,以我目前的水平我认为凯撒加密还是很安全的,请大家放心
    如果您实在过意不去,可以在github上看到我们开源的算法,并且自行修改
    
    --作者自述--
    我是一个初一的up,这是我自己凭借爱好和业余时间写的代码,可能会有很多bug,请您见谅
    目前有很多有意思的功能正在开发中,如果您有好的建议也可以给我发邮件 3538501048@qq.com(记得注明您的来源和意图,我抽时间看到一定会回复)


​            
    感谢大家的支持
            '''
    
        window_show_output.insert('insert',text)







    #############################################################################


    window = tk.Tk()
    window.title('密码管理器GUI版')
    window.geometry('686x471')
    
    #canvas=tk.Canvas(window,height=580,width=580)
    #main_image=tk.PhotoImage(file='??????????')
    #main_image=canvas.create_image(0,0,anchor='nw',image=main_image)
    #canvas.pack(side='top')
    
    tk.messagebox.showerror(title='Hi', message='欢迎使用密码本 请仔细阅读使用说明') #欢迎
    
    #设置一个名牌
    logo=tk.Label(window,text='由MRX制作,GitHub链接:https://github.com/MRX-J0BS/Net_Code')
    logo.pack(side=tk.BOTTOM)
    
    tk.Label(window, text='User name: ').place(x=20, y= 30)
    tk.Label(window, text='Password: ').place(x=20, y= 60)
    
    var_usr_name = tk.StringVar()
    var_usr_name.set('')
    entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
    entry_usr_name.place(x=140, y=30)
    #entry_usr_name.pack()
    
    var_usr_pwd = tk.StringVar()
    var_usr_pwd.set('')
    entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
    entry_usr_pwd.place(x=140, y=60)
    #entry_usr_pwd.pack()
    
    #var_usr_data = tk.StringVar()
    #var_usr_data.set('')



    #密钥输入界面
    #window_input_key=tk.Entry(window,show='*',text='密钥')
    #window_input_key.pack()


    #总输出窗口
    window_show_output=tk.Text(window,width=90)
    window_show_output.place(x=20,y=100)
    
    #读取所有密码的按钮
    b=tk.Button(window,text='读取所有密码',command=show)
    b.place(x=400,y=30)


    #输入新密码的窗口
    d=tk.Button(window,text='点我加入新密码',command=code_append)
    d.place(x=550,y=30)
    
    e=tk.Button(window,text='生成高强度密码',command=code_append_ai)
    e.place(x=400,y=60)
    
    #清空输出窗口的按钮
    #c=tk.Button(window,text='清空',command=clean)
    #c.pack()
    
    f=tk.Button(window,text='使用手册',command=readme)
    f.place(x=550,y=60)
    
    window.mainloop()

以上就是本文全部内容,感谢观看~
有问题欢迎与我联系哦

评论

此博客中的热门博文

arch下HP打印机驱动的安装与使用