记一次凯撒加密程序的开发
前情提要
之前了解了一些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()
以上就是本文全部内容,感谢观看~
有问题欢迎与我联系哦
评论
发表评论