python实现凯撒密码加密与解密(暴⼒求解)
在密码学中,凯撒密码(英语:Caesar cipher),或称凯撒加密、凯撒变换、变换加密,是⼀种最简单且最⼴为⼈知的加密技术。它是⼀种替换加密的技术,明⽂中的所有字母都在字母表上向后(或向前)按照⼀个固定数⽬进⾏偏移后被替换成密⽂。
需求分析:
1、输⼊⼀⾏明⽂,使⽤凯撒加密⽅法对其加密,其中为保证加密的随机性,对Key进⾏随机处理。
2、对于加密后的密⽂,使⽤暴⼒搜索的⽅法对其进⾏解密,并调⽤字典对解密后的字词进⾏⽐较,⾃动选出正确的密匙。
例如:
先放⼀个不带UI界⾯的代码
from random import randint
import enchant
from enchant.checker import SpellChecker
import numpy as np
import string
#加密
def kaisa(s, k):# 定义函数接受⼀个字符串s 和⼀个偏移量k
lower = string.ascii_lowerca # ⼩写字母
upper = string.ascii_upperca # ⼤写字母
before = string.ascii_letters # ⽆偏移的字母顺序⼩写+⼤写
害相思
after = lower[k:]+ lower[:k]+ upper[k:]+ upper[:k]# 偏移后的字母顺序还是⼩写+⼤写
# 分别把⼩写字母和⼤写字母偏移后再加到⼀起
table =''.maketrans(before, after)# 创建映射表
anslate(table)# 对s进⾏偏移即加密
s =input('请输⼊⼀个字符串:')
k = randint(0,26)#从0-25中挑选随机⼀个数字当做偏移量
垃圾收集print(kaisa(s, k))
print(kaisa(s, k))
#解密
# message = input("message:")
message = kaisa(s,k)
LETTERS ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
true_yuju =""
tmp = np.ones((1,26))
# print(tmp)
# 把每个可能的密钥循环⼀遍
message ="GUVF VF ZL FRPERG ZRFFNTR"
for key in range(len(LETTERS)):
# key代表密钥
# translated设为空字符串
# 每次循环后清空.
translated =''
# 密⽂⾥的每⼀个字符按顺序解密
for symbol in message:
if symbol in LETTERS:
num = LETTERS.find(symbol)# 在26个字母⾥搜索到密⽂字符的位置
num = num - key
# 检查是否⼩于0,如果⼩于0,就加上26
if num <0:
num = num +len(LETTERS)
# 把解密之后的字符追加到translated字符串的末尾
translated = translated + LETTERS[num]
el:
# 密⽂⾥的symbol如果不在26个字母⾥,就不进⾏解密,直接追加到字符串末尾 translated = translated + symbol
# 输出解密采⽤的key和解密后的明⽂
print('Key #%s: %s'%(key, translated))李雨露
chkr = SpellChecker("en_US")
chkr.t_text(translated)
for err in chkr:
if(err.word ==None):
true_yuju = translated
el:
tmp[0][key]=0
if(tmp[0][key]==1):
true_yuju = translated
print("正确的是: ",true_yuju)
再放⼀个带UI界⾯的代码:
import tkinter
from tkinter import*
# from project1 import kaisa
from random import randint
import string
import numpy as np
from enchant.checker import SpellChecker
def kaisa(s, k):# 定义函数接受⼀个字符串s 和⼀个偏移量k
lower = string.ascii_lowerca # ⼩写字母
upper = string.ascii_upperca # ⼤写字母
before = string.ascii_letters # ⽆偏移的字母顺序⼩写+⼤写
after = lower[k:]+ lower[:k]+ upper[k:]+ upper[:k]# 偏移后的字母顺序还是⼩写+⼤写# 分别把⼩写字母和⼤写字母偏移后再加到⼀起
table =''.maketrans(before, after)# 创建映射表
anslate(table)# 对s进⾏偏移即加密
class MY_GUI():
def__init__(lf, init_window_name):
lf.init_window_name = init_window_name
def t_init_window(lf):
lf.init_window_name.title("凯撒密码")
lf.init_ry('680x500+10+10')
lf.init_sizable(Fal,Fal)
lf.init_label = Label(lf.init_window_name, text ="初始字符串: ", height =2, width =10,anchor="w")
lf.id(row =0, column =0)
中班健康lf.decipher_label = Label(lf.init_window_name, text ="解密后结果: ", height =2, width =10,anchor="w") lf.id(row =2, column =0)
lf.init_data_Text = Text(lf.init_window_name, height =1, width =70)
# lf.init_data_Text.inrt(1.0, "abc")
lf.init_id(row =0, column =1, padx =5, pady =5)
lf.decipher_data_Text = Text(lf.init_window_name, width =70, height =30)
lf.decipher_id(row =2, column =1, padx =5, pady =5,rowspan =30)
lf.decipher_button = Button(lf.init_window_name, text="解密", width =10, command = lf.decipher)
lf.id(row =2, column =11)
def encipher(lf):
str= lf.init_(1.0, END)
k = randint(0,26)
encipher_text = kaisa(str, k)
#encipher_text = "abc"
def decipher(lf):
message = lf.encipher_(1.0, END)
LETTERS ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
true_yuju =""
tmp = np.ones((1,26))
# print(tmp)
# 把每个可能的密钥循环⼀遍
result =""
KEY =0
for key in range(len(LETTERS)):
# key代表密钥
# translated设为空字符串
# 每次循环后清空.
translated =''
# 密⽂⾥的每⼀个字符按顺序解密
for symbol in message:
if symbol in LETTERS:
num = LETTERS.find(symbol)# 在26个字母⾥搜索到密⽂字符的位置
num = num - key
jxcad素三鲜包子
# 检查是否⼩于0,如果⼩于0,就加上26
if num <0:
num = num +len(LETTERS)
# 把解密之后的字符追加到translated字符串的末尾
translated = translated + LETTERS[num]
el:
鲁迅先生的故事
# 密⽂⾥的symbol如果不在26个字母⾥,就不进⾏解密,直接追加到字符串末尾
translated = translated + symbol
# 输出解密采⽤的key和解密后的明⽂
贵州医科大学神奇民族医药学院
print('Key #%s: %s'%(key, translated))
print('Key #%s: %s'%(key, translated))
result +="Key #"+str(key)+": "+str(translated)
result = result.strip('\n')
result +='\n'
chkr = SpellChecker("en_US")
chkr.t_text(translated)
for err in chkr:
if(err.word ==None):
true_yuju = translated
el:
tmp[0][key]=0
if(tmp[0][key]==1):
true_yuju = translated
KEY = key
result +='\n'+'\n'
true_yuju ="Key为: "+str(KEY)+" 解密后的信息为: "+ true_yuju
result += true_yuju
lf.decipher_data_Text.inrt(1.0, result)
def gui_start():
init_window = Tk()
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗⼝默认属性
ZMJ_PORTAL.t_init_window()
init_window.mainloop()# ⽗窗⼝进⼊事件循环,可以理解为保持窗⼝运⾏,否则界⾯不展⽰gui_start()