这个是大二上的程序设计周选择的题目,半年前写的。没办法,硬盘坏了只能现在发出来。
用了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() #主窗口循环显示


crypto      python

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