密码学第一个实验。
三转轮密码机,慢轮中轮快轮,每加密一个字符,快轮转动一圈,快轮每转动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() 



crypto      python

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!