维吉尼亚密文解密小程序
这几天在看CTF相关的课程,涉及到古典密码学和近代密码学还有现代密码学。自己编了一个解密小程序。
Vigenere 维吉尼亚密码
维吉尼亚是多表替换密码中比较典型的代表,维吉尼亚密码是在凯撒密码基础上产生的一种加密方法, 它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。
现有明文:vigenere和密钥:Abc(不区分大小写)
首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到相同。本例中,明文长度为3 个字母(非字母均被忽略),密钥会被程序补全为"abcabcab"。
- 维吉尼亚密码只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留。
- 如果输入多行文本,每行是单独加密的。
密文:vjieogrf
源码如下:
# 维吉尼亚密码解密
import tkinter as tk
from tkinter import ttk
def decrypt_vigenere():
content = content_entry.get()
key = key_entry.get()
flag = ''
key_to_num = [ord(k) - 97 for k in key.lower()]
for i in range(len(content)):
if content[i].islower():
flag += chr((ord(content[i]) - 97 - key_to_num[i % len(key)]) % 26 + 97)
elif content[i].isupper():
flag += chr((ord(content[i]) - 65 - key_to_num[i % len(key)]) % 26 + 65)
else:
flag += content[i]
decrypted_entry.delete(0, tk.END) # 清空解密结果框
decrypted_entry.insert(0, flag) # 在解密结果框中插入解密后的文本
# 创建 GUI 窗口
window = tk.Tk()
window.title("维吉尼亚密文解密小程序 微信公众号--强壮Python")
# 创建控件
content_label = ttk.Label(window, text="密 文:")
content_entry = ttk.Entry(window, width=60)
key_label = ttk.Label(window, text="密 钥:")
key_entry = ttk.Entry(window, width=60)
decrypted_label = ttk.Label(window, text="解密输出:")
decrypted_entry = ttk.Entry(window, width=60)
# 布局控件
content_label.grid(row=0, column=0, sticky="w")
content_entry.grid(row=0, column=1)
key_label.grid(row=1, column=0, sticky="w")
key_entry.grid(row=1, column=1)
decrypted_label.grid(row=3, column=0, sticky='w')
decrypted_entry.grid(row=3, column=1)
decrypt_button = ttk.Button(window, text="解 密", command=decrypt_vigenere)
decrypt_button.grid(row=4, column=0, columnspan=2)
# 运行窗口
window.mainloop()
运行结果如下:
备注:GUI界面由AI生成。