密码学第一个实验。
三转轮密码机,慢轮中轮快轮,每加密一个字符,快轮转动一圈,快轮每转动26圈中轮转动一圈,中轮每转动26圈慢轮转动一圈。
因此三转轮密码机的密钥空间为26*26*26=17576
代码:
from tkinter import *
import tkinter as tk
import tkinter.messagebox
window =tk.Tk() #实例化object
window.title('转轮密码机') #窗口标题
window.geometry('1000x400') #窗口尺寸
a=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
def TurnWheel(wheel_l,wheel_r):
temp_l=wheel_l[-1]
wheel_l.pop()#移除尾元素
wheel_l.insert(0,temp_l)
temp_r=wheel_r[-1]
wheel_r.pop()#移除尾元素
wheel_r.insert(0,temp_r)
def ReverseWheel(wheel_l,wheel_r):
temp_l=wheel_l[0]
wheel_l.pop(0)#移除首元素
wheel_l.append(temp_l)
temp_r=wheel_r[0]
wheel_r.pop(0)#移除首元素
wheel_r.append(temp_r)
def encrypt():
if text1.get(1.0, END) == '\n':#获取原文文本框内容
tkinter.messagebox.showinfo('提示', '请输入原文')
else:
slow_l=[24,25,26,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
slow_r=[21,3,15,1,19,10,14,26,20,8,16,7,22,4,11,5,17,9,12,23,18,2,25,6,24,13]
middle_l=[26,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
middle_r=[20,1,6,4,15,3,14,12,23,5,16,2,22,19,11,18,25,24,13,7,10,8,21,9,26,17]
fast_l=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
fast_r=[8,18,26,17,20,22,10,3,13,11,4,23,5,24,9,12,25,16,19,6,15,21,2,7,1,14]
Plaintext=text1.get(1.0,END).strip()#删除最后一位\n元素
cipher=''
count=0
for element in Plaintext :
cipher+=a[fast_r.index(fast_l[middle_r.index(middle_l[slow_r.index(slow_l[a.index(element)])])])]
count+=1
TurnWheel(fast_l,fast_r)
if(count%26==0):
TurnWheel(middle_l,middle_r)
if(count%(26*26)==0):
TurnWheel(slow_l,slow_r)
text2.delete(1.0, END)
text2.insert(1.0, cipher)
def decrypt():
if text2.get(1.0,END) == '\n': #获取密文文本框内容
tkinter.messagebox.showinfo('提示', '请输入密文')
else:
Ciphertext=text2.get(1.0,END).strip()
plain=''
slow_l=[24,25,26,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
slow_r=[21,3,15,1,19,10,14,26,20,8,16,7,22,4,11,5,17,9,12,23,18,2,25,6,24,13]
middle_l=[26,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
middle_r=[20,1,6,4,15,3,14,12,23,5,16,2,22,19,11,18,25,24,13,7,10,8,21,9,26,17]
fast_l=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
fast_r=[8,18,26,17,20,22,10,3,13,11,4,23,5,24,9,12,25,16,19,6,15,21,2,7,1,14]
count=0
for element in Ciphertext:#先把转轮机转到加密后的状态
count+=1
TurnWheel(fast_l,fast_r)
if(count%26==0):
TurnWheel(middle_l,middle_r)
if(count%(26*26)==0):
TurnWheel(slow_l,slow_r)
for element in Ciphertext[::-1]:
ReverseWheel(fast_l,fast_r)
plain+=a[slow_l.index(slow_r[middle_l.index(middle_r[fast_l.index(fast_r[a.index(element)])])])]
if(count%26==0):
TurnWheel(middle_l,middle_r)
if(count%(26*26)==0):
TurnWheel(slow_l,slow_r)
count-=1
text1.delete(1.0, END)
text1.insert(1.0, plain[::-1])
if __name__=='__main__':
labe1 = tk.Label(window, text='原文:', font=('宋体', 12), width=20, height=2)
labe2 = tk.Label(window, text='密文:', font=('宋体', 12), width=20, height=2)
labe3 = tk.Label(window, text='请输入大写字母,原文经过加密后输出在密文框,转轮机恢复初始状态.解密时先从初始状态转到加密后状态,再进行解密', bg='green', font=('宋体', 12), width=100, height=4)
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)
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)
labe1.place(relx=0,rely=0.35,relwidth=0.3)
labe2.place(relx=0,rely=0.75,relwidth=0.3)
labe3.place(relx=0,rely=0,relwidth=1)
button1.place(relx=0.3,rely=0.9)
button2.place(relx=0.6,rely=0.9)
window.mainloop()
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!