这个是大二上的程序设计周选择的题目,半年前写的。没办法,硬盘坏了只能现在发出来。
用了tkinter库
from tkinter import *
import tkinter as tk
import tkinter.filedialog
import tkinter.messagebox
import tkinter.simpledialog
window =tk.Tk() #实例化object
window.title('混合密码算法的模拟实现') #窗口标题
window.geometry('800x400') #窗口尺寸
def encrypt():#加密,首先判断原文是否为空,不为空根据radiobutton的值进行对应的加密
if text1.get(1.0, END) == '\n':#获取原文文本框内容
tkinter.messagebox.showinfo('提示', '请输入原文')
else:
if var.get() =='A':
kaisa_encrypt(text1.get(1.0,END))
if var.get() =='B':
affine_encrypt(text1.get(1.0,END))
if var.get()== 'C':
swift_encrypt(text1.get(1.0,END))
if var.get()=='D':
cycle_encrypt(text1.get(1.0,END))
if var.get()=='E':
swift_encrypt(kaisa_encrypt(text1.get(1.0, END)))
if var.get()=='F':
swift_encrypt(affine_encrypt(text1.get(1.0,END)))
if var.get()=='G':
cycle_encrypt(kaisa_encrypt(text1.get(1.0, END)))
if var.get()=='H':
cycle_encrypt(affine_encrypt(text1.get(1.0,END)))
def decrypt():#解密,首先判断密文是否为空,不为空根据radiobutton的值进行对应的解密
if text2.get(1.0,END) == '\n': #获取密文文本框内容
tkinter.messagebox.showinfo('提示', '请输入密文')
else:
if var.get() == 'A':
kaisa_decrypt(text2.get(1.0,END))
if var.get() == 'B':
affine_decrypt(text2.get(1.0, END))
if var.get() == 'C':
swift_decrypt(text2.get(1.0, END))
if var.get()=='D':
cycle_decrypt(text2.get(1.0,END))
if var.get()=='E':
kaisa_decrypt(swift_decrypt(text2.get(1.0, END)))
if var.get()=='F':
affine_decrypt(swift_decrypt(text2.get(1.0, END)))
if var.get()=='G':
kaisa_decrypt(cycle_decrypt(text2.get(1.0,END)))
if var.get()=='H':
affine_decrypt(cycle_decrypt(text2.get(1.0,END)))
def file_import():#原文导入功能
filename = tk.filedialog.askopenfilename()
if filename != '':
with open(filename, 'r') as f:
text1.delete(1.0, END)
text1.insert(1.0, f.read())
else:
tkinter.messagebox.showinfo('提示', '未选择文件')
def file_save():#原文导出功能
if text1.get(1.0,END) == '\n':
tkinter.messagebox.showinfo('提示', '原文为空')
else:
filename = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("TXT", ".txt")])
with open(filename, 'a') as f:
f.write(text1.get(1.0, END))
def cipher_import():#密文导入功能
filename = tk.filedialog.askopenfilename()
if filename != '':
with open(filename, 'r') as f:
text2.delete(1.0, END)
text2.insert(1.0, f.read())
else:
tkinter.messagebox.showinfo('提示', '未选择文件')
def cipher_save():#密文导出功能
if text2.get(1.0,END) == '\n':
tkinter.messagebox.showinfo('提示', '密文为空')
else:
filename = tkinter.filedialog.asksaveasfilename(title=u'保存文件', filetypes=[("TXT", ".txt")])
with open(filename, 'a') as f:
f.write(text2.get(1.0, END))
def kaisa_encrypt(str):
k=int(tk.simpledialog.askstring("提示", "请输入偏移量(1-25):",initialvalue='3'))#变量k保存用户输入的偏移量值
cipher=[]#列表储存密文
for i in range(len(str)):
if str[i].islower():
if ord(str[i]) < 123 - k:
c = chr(ord(str[i]) + k)
cipher.append(c)
else:
c = chr(ord(str[i]) + k - 26)
cipher.append(c)
elif str[i].isupper():
if ord(str[i]) < 91 - k:
c = chr(ord(str[i]) + k)
cipher.append(c)
else:
c = chr(ord(str[i]) + k - 26)
cipher.append(c)
else:
c = str[i]
cipher.append(c)
cipherstr = ''.join(cipher)
text2.delete(1.0, END)
text2.insert(1.0, cipherstr)
return cipherstr
def kaisa_decrypt(str):
k = int(tk.simpledialog.askstring("提示", "请输入偏移量(1-25):", initialvalue='3'))#变量k保存用户输入的偏移量值
cipher=[]
for i in range(len(str)):
if str[i].islower():
if ord(str[i]) > 96 + k:
c = chr(ord(str[i]) - k)
cipher.append(c)
else:
c = chr(ord(str[i]) - k + 26)
cipher.append(c)
elif str[i].isupper():
if ord(str[i]) > 64 +k:
c = chr(ord(str[i]) - k)
cipher.append(c)
else:
c = chr(ord(str[i]) - k + 26)
cipher.append(c)
else:
c = str[i]
cipher.append(c)
cipherstr = ''.join(cipher)
text1.delete(1.0, END)
text1.insert(1.0, cipherstr)
def affine_encrypt(str):
x =tk.simpledialog.askstring("提示", "请输入密钥a,b(gcd(a,b)=1&&gcd(a,26)=1):", initialvalue='5,8')
a=int(x[0:list(x).index(',')])
b=int(x[list(x).index(',')+1:])
t1='abcdefghijklmnopqrstuvwxyz'
t2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cipher=[]
for i in str:
if i in t1:
m=list(t1).index(i)
cipher.append(t1[(a*m+b)%26])
elif i in t2:
m = list(t2).index(i)
cipher.append(t2[(a* m + b) % 26])
else:
cipher.append(i)
cipherstr = ''.join(cipher)
text2.delete(1.0, END)
text2.insert(1.0, cipherstr)
return cipherstr
def inverse(m,n): #求逆元
m1 = m
n1 = n
r = m % n
q = [] # 从q1开始,到qn
yu = [r]
while (r != 0):
m = n
n = r
r = m % n
yu.append(r)
q.append(m // n)
q.pop()
s = [0, 1]
for i in range(len(q)):
s.append(-q[i] * s[i + 1] + s[i])
s1 = s.pop()
return s1
def affine_decrypt(str):
x = tk.simpledialog.askstring("提示", "请输入密钥a,b(gcd(a,b)=1&&gcd(a,26)=1):", initialvalue='5,8')
a = int(x[0:list(x).index(',')])
b = int(x[list(x).index(',') + 1:])
c=inverse(a,26)#c为a的逆元
t1='abcdefghijklmnopqrstuvwxyz'
t2='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
cipher=[]
for i in str:
if i in t1:
m=list(t1).index(i)
cipher.append(t1[int(((m-b)*c)%26)])
elif i in t2:
m = list(t2).index(i)
cipher.append(t2[int(((m-b)*c)% 26)])
else:
cipher.append(i)
cipherstr = ''.join(cipher)
text1.delete(1.0, END)
text1.insert(1.0, cipherstr)
def swift_encrypt(str):
str=str[0:-1] #切片去除字符串最后默认有的换行
key=tk.simpledialog.askstring("提示", "请输入密钥(默认为code):",initialvalue='code')
k=len(key)# 列数
str+=' '*(k-(len(str)%k))#用空格填充
list1=[] #用来获取列置换的规律,例如code表示1423
for i in key:
n=1
for j in key:
if i > j:
n+=1
list1.append(n)
l=int((len(str)/k))#行数
cipher=[] #置换前的矩阵
for i in range(0,k):
cipher.append(''.join([str[j] for j in range(0,len(str)) if j%k==i ]))
m=[] #保存置换后的矩阵
for i in list1:
m.append(cipher[i-1])
n='' #保存置换后并按顺序排列
for i in range(0,l):
for j in range(0,k):
n+=m[j][i]
text2.delete(1.0, END)
text2.insert(1.0, n)
def swift_decrypt(str):
str = str[0:-1] # 切片去除字符串最后默认有的换行
key = tk.simpledialog.askstring("提示", "请输入密钥(默认为code):", initialvalue='code')
k = len(key) # 列数
list1 = [] # 用来获取列置换的规律
for i in key:
n = 1
for j in key:
if i > j:
n += 1
list1.append(n)
l = int((len(str) / k)) # 行数
cipher = [] # 置换前的矩阵
for i in range(0, k):
cipher.append(''.join([str[j] for j in range(0, len(str)) if j % k == i]))
m = [] # 保存置换后的矩阵
for i in range(1,k+1):
m.append(cipher[list1.index(i)])
n=''
for i in range(0,l):
for j in range(0,k):
n+=m[j][i]
text1.delete(1.0, END)
text1.insert(1.0, n)
return n
def cycle_encrypt(str):
str = str[0:-1] # 切片去除字符串最后默认有的换行
key = tk.simpledialog.askstring("提示", "请输入密钥(默认为1324):", initialvalue='1324')
k = len(key) # 列数
str += ' ' * (k - (len(str) % k)) # 用空格填充
l = int((len(str) / k)) # 行数
cipher = [] # 置换前的矩阵
for i in range(0, k):
cipher.append(''.join([str[j] for j in range(0, len(str)) if j % k == i]))
m = ['' for i in range(0,k)]# 保存置换后的矩阵
for i in range(0,k-1):
m[int(key[i+1])-1]=cipher[int(key[i])-1]
m[int(key[0])-1]=cipher[int(key[k-1])-1]
n = '' # 保存置换后并按顺序排列
for i in range(0, l):
for j in range(0, k):
n += m[j][i]
text2.delete(1.0, END)
text2.insert(1.0, n)
def cycle_decrypt(str):
str = str[0:-1] # 切片去除字符串最后默认有的换行
key = tk.simpledialog.askstring("提示", "请输入密钥(默认为1324):", initialvalue='1324')
key=key[::-1]#反转字符串
k = len(key) # 列数
l = int((len(str) / k)) # 行数
cipher = [] # 置换前的矩阵
for i in range(0, k):
cipher.append(''.join([str[j] for j in range(0, len(str)) if j % k == i]))
m = ['' for i in range(0, k)] # 保存置换后的矩阵
for i in range(0, k - 1):
m[int(key[i + 1]) - 1] = cipher[int(key[i]) - 1]
m[int(key[0]) - 1] = cipher[int(key[k - 1]) - 1]
n = '' # 保存置换后并按顺序排列
for i in range(0, l):
for j in range(0, k):
n += m[j][i]
text1.delete(1.0, END)
text1.insert(1.0, n)
return n
if __name__ =="__main__":
label = tk.Label(window, text='请选择加密方式:', bg='green', font=('宋体', 12), width=20, height=2)
labe2 = tk.Label(window, text='原文:', font=('宋体', 12), width=20, height=2)
labe3 = tk.Label(window, text='密文:', font=('宋体', 12), width=20, height=2)
text1 = tk.Text(window, show=None, font=('Arial', 10))
text2 = tk.Text(window, show=None, font=('Arial', 10))
button1 = tk.Button(window, text='加密', font=('宋体', 12,), width=5, height=1, command=encrypt)
button2 = tk.Button(window, text='解密', font=('宋体', 12,), width=5, height=1, command=decrypt)
button3 = tk.Button(window,text="导入原文",command=file_import)
button4 = tk.Button(window,text="导出密文",command=cipher_save)
button5 = tk.Button(window, text="导出原文", command=file_save)
button6 = tk.Button(window, text="导入密文", command=cipher_import)
var = tk.StringVar()
r1 = tk.Radiobutton(window, text='凯撒密码', variable=var,value='A')
r2 = tk.Radiobutton(window, text='仿射密码', variable=var, value='B')
r3 = tk.Radiobutton(window, text='列置换', variable=var, value='C')
r4 = tk.Radiobutton(window, text='周期置换', variable=var, value='D')
r5 = tk.Radiobutton(window, text='凯撒+列置换', variable=var, value='E')
r6 = tk.Radiobutton(window, text='仿射+列置换', variable=var, value='F')
r7 = tk.Radiobutton(window, text='凯撒+周期置换', variable=var, value='G')
r8 = tk.Radiobutton(window, text='仿射+周期置换', variable=var, value='H')
text1.place(relx=0.2,rely=0.3,relwidth=0.6,relheight=0.2)
text2.place(relx=0.2,rely=0.7,relwidth=0.6,relheight=0.2)
label.place(relx=0,rely=0,relwidth=0.3)
labe2.place(relx=0,rely=0.35,relwidth=0.3)
labe3.place(relx=0,rely=0.75,relwidth=0.3)
r1.place(relx=0.3,rely=0,relwidth=0.3,relheight=0.1)
r2.place(relx=0.3,rely=0.1,relwidth=0.3,relheight=0.1)
r3.place(relx=0.5,rely=0,relwidth=0.3,relheight=0.1)
r4.place(relx=0.5,rely=0.1,relwidth=0.3,relheight=0.1)
r5.place(relx=0.7,rely=0,relwidth=0.3,relheight=0.1)
r6.place(relx=0.7, rely=0.1, relwidth=0.3, relheight=0.1)
r7.place(relx=0.35, rely=0.2, relwidth=0.2, relheight=0.1)
r8.place(relx=0.55, rely=0.2, relwidth=0.2, relheight=0.1)
button1.place(relx=0.3,rely=0.9)
button2.place(relx=0.6,rely=0.9)
button3.place(relx=0.85,rely=0.3,relwidth=0.1,relheight=0.1)
button6.place(relx=0.85,rely=0.7,relwidth=0.1,relheight=0.1)
button5.place(relx=0.85, rely=0.4, relwidth=0.1, relheight=0.1)
button4.place(relx=0.85, rely=0.8, relwidth=0.1, relheight=0.1)
window.mainloop() #主窗口循环显示
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!