实验1.1
4/凯撒密码是一种单表置换密码,它的加密方法就是把明文中所有字母都用它右面的第k个字母代替,并认为z后面又是a。加密函数可以表示为:
f(a ) = ( a +k ) mod n
其中f(a)表示密文字母在字母表中的位置,a表示明文字母在字母表中的位置,k是密钥, n为字母表中的字符个数。
设有明文security ,密钥k =3,密钥字母表如表2.14所示,其中字母表示明文或密文字符集,数字表示字母在密钥字母表中的位置。
表2.14密钥字母表
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
0 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
(1)请写出加密后的密文。
vhfxulwb
(2)请写出该凯撒密码的解密函数。
a=(f(a)-k+26)%26
(3)请用高级语言编写通用凯撒密码的加密/解密程序。
开发运行环境说明:Python3
源代码:
import PySimpleGUI as simpleGui
import datetime
class item:
def __init__(self):
self.zm=['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']
self.sz=[0,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]
a=item()
# print(a.sz[6])
def dealMainWindowOpenWindowEvent(window2):#点击打开新窗口所产生的事件
try:
if not window2:#只能打开一个新窗口
window2 = make_window2()
window2.make_modal() # 这行代码把当前窗口设置为有模式的
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
return window2
def dealMainWindowEncryptEvent(values):#点击加密产生的事件
try:
text = values['keyMainWindowPlaintext']
if text.strip() == "":
simpleGui.popup_error("提示", "请先输入明文!")
else:
# simpleGui.popup("提示", "请自己实现加密函数!!!")
b=[]
for i in values['keyMainWindowPlaintext']:
# print(i)
for j in range(26):
if(i==a.zm[j]):
b.append(a.zm[(j+int(values['keyMainWindowKey']))%26])
return b
# values['keyMainWindowCiphertext']=1
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
def dealMainWindowDecryptEvent(values): # 点击解密产生的事件
try:
text = values['keyMainWindowCiphertext']
if text.strip() == "":
simpleGui.popup_error("提示", "请先输入密文!")
else:
c = []
for i in values['keyMainWindowCiphertext']:
for j in range(26):
if (i == a.zm[j]):
c.append(a.zm[(j - int(values['keyMainWindowKey'])+26) % 26])
return c
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
def dealWindow2OkEvent(window2, values):#点击窗口2的"确定"所产生的事件
newText = ""
try:
newText = values['keyWindow2ulText']#从输入框获得文字
window2.close()#关闭
window2 = None
except Exception as result:
print("函数 dealWindow2Event 捕捉到异常:%s" % result)
return window2, newText
def make_window2():#创建新窗口的方法
try:
# 创建 window2 布局
window2Layout = [
[simpleGui.Text('文本'), simpleGui.Input('新窗口默认文本 hello gui。', key='keyWindow2ulText')],
[simpleGui.Button('确定', key='keyWindow2Ok'), simpleGui.Button('取消', key='keyWindow2Cancel')]
]
window2 = simpleGui.Window("打开新窗口", window2Layout, finalize=True)
return window2
except Exception as result:
print("make_window2 捕捉到异常:%s" % result)
def main():
try:
# 创建 mainWindow 布局
mainWindowLayout = [
[simpleGui.Text('明文'), simpleGui.Input(key='keyMainWindowPlaintext', size=(80, 1)), ],
[simpleGui.Text('密钥'), simpleGui.Input(key='keyMainWindowKey', size=(80, 1)), ],
[simpleGui.Text('密文'), simpleGui.Input(key='keyMainWindowCiphertext', size=(80, 1)), ],
[simpleGui.Text('文本'), simpleGui.Multiline(key='keyMainWindowMulText', size=(80, 8))],
[simpleGui.Button('加密', key='keyMainWindowEncrypt'),
simpleGui.Button('解密', key='keyMainWindowDecrypt'),
simpleGui.Button('打开新窗口', key='keyMainWindowOpenWindow'), ],
[simpleGui.Button('确定', key='keyMainWindowOk'), simpleGui.Button('取消', key='keyMainWindowCancel')],
]
# 创建窗口,引入布局,并进行初始化。
mainWindow = simpleGui.Window('对称加密演示程序', layout=mainWindowLayout, finalize=True)
# 暂时先不创建window2
window2 = None
# 创建一个事件循环,否则窗口运行一次就会被关闭。
while True:
window, event, values = simpleGui.read_all_windows()
print(window, event, values) # 可以打印一下着看变量的内容
if window == mainWindow:
if event in (simpleGui.WIN_CLOSED, 'keyMainWindowOk', 'keyMainWindowCancel'):#点击主窗口的关闭按钮或者确定按钮或者取消按钮
break
elif event == 'keyMainWindowOpenWindow':
window2 = dealMainWindowOpenWindowEvent(window2)#点击打开新窗口所产生的事件
elif event == 'keyMainWindowEncrypt':
miwen=dealMainWindowEncryptEvent(values)#点击加密产生的事件
mainWindow['keyMainWindowCiphertext'].update(miwen)#在密文框中输出密文
elif event == 'keyMainWindowDecrypt':
mingwen = dealMainWindowDecryptEvent(values) # 点击解密产生的事件
mainWindow['keyMainWindowPlaintext'].update(mingwen) # 在明文框中输出明文
if window == window2:
if event in (simpleGui.WIN_CLOSED, 'keyWindow2Cancel'):#点击窗口2的"取消"所产生的事件
window2.close()
window2 = None
elif event == 'keyWindow2Ok':#点击窗口2的"确定"所产生的事件
window2, newText = dealWindow2OkEvent(window2, values)
text = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + "\n从window2获得文本:\n" + newText
mainWindow['keyMainWindowMulText'].update(text)
# 关闭窗口
mainWindow.close()
if window2 is not None:
window2.close()
except Exception as result:
print("函数 main 捕捉到异常:%s" % result)
if __name__ == '__main__':
main()
实验1.2
设英文字母a,b,c,…,z的编号分别为0,1 ,2,… ,25,仿射密码加密变换可以表示为
c = (3m + 5) mod 26
其中m表示明文编号,c表示密文编号。
(1)试对明文security进行加密。
h r l n e d k z
(2)写出该仿射密码的解密函数。
m=(3^(-1))*(c-5) mod 26
(3)试对密文进行解密。
开发运行环境说明:Python3
源代码:(和1.1类似,代码有点小问题,还望读者完善)
import PySimpleGUI as simpleGui
import datetime
class item:
def __init__(self):
self.zm=['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']
self.sz=[0,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]
a=item()
# print(2/3)
def dealMainWindowOpenWindowEvent(window2):#点击打开新窗口所产生的事件
try:
if not window2:#只能打开一个新窗口
window2 = make_window2()
window2.make_modal() # 这行代码把当前窗口设置为有模式的
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
return window2
def dealMainWindowEncryptEvent(values):#点击加密产生的事件
try:
text = values['keyMainWindowPlaintext']
if text.strip() == "":
simpleGui.popup_error("提示", "请先输入明文!")
else:
# simpleGui.popup("提示", "请自己实现加密函数!!!")
b=[]
for i in values['keyMainWindowPlaintext']:
# print(i)
for j in range(26):
if(i==a.zm[j]):
# b.append(a.zm[(j+int(values['keyMainWindowKey']))%26])
b.append(a.zm[(3*j + 5) % 26])
return b
# values['keyMainWindowCiphertext']=1
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
def dealMainWindowDecryptEvent(values): # 点击解密产生的事件
try:
text = values['keyMainWindowCiphertext']
if text.strip() == "":
simpleGui.popup_error("提示", "请先输入密文!")
else:
c = []
for i in values['keyMainWindowCiphertext']:
for j in range(26):
if (i == a.zm[j]):
# c.append(a.zm[(j - int(values['keyMainWindowKey'])+26) % 26])
c.append(a.zm[(3^(-1))*(j - 5) % 26])#将security的密文hrlnedkz再次解密发现明文变成了secueigy
# for k in range(4):
# p=j
# if((p-5)/3==0):
# c.append(a.zm[((p - 5)/3 )%26])
# break
# else:
# p=p+26
return c
except Exception as result:
print("函数 dealMainWindowEvent 捕捉到异常:%s" % result)
def dealWindow2OkEvent(window2, values):#点击窗口2的"确定"所产生的事件
newText = ""
try:
newText = values['keyWindow2ulText']#从输入框获得文字
window2.close()#关闭
window2 = None
except Exception as result:
print("函数 dealWindow2Event 捕捉到异常:%s" % result)
return window2, newText
def make_window2():#创建新窗口的方法
try:
# 创建 window2 布局
window2Layout = [
[simpleGui.Text('文本'), simpleGui.Input('新窗口默认文本 hello gui。', key='keyWindow2ulText')],
[simpleGui.Button('确定', key='keyWindow2Ok'), simpleGui.Button('取消', key='keyWindow2Cancel')]
]
window2 = simpleGui.Window("打开新窗口", window2Layout, finalize=True)
return window2
except Exception as result:
print("make_window2 捕捉到异常:%s" % result)
def main():
try:
# 创建 mainWindow 布局
mainWindowLayout = [
[simpleGui.Text('明文'), simpleGui.Input(key='keyMainWindowPlaintext', size=(80, 1)), ],
[simpleGui.Text('密钥'), simpleGui.Input(key='keyMainWindowKey', size=(80, 1)), ],
[simpleGui.Text('密文'), simpleGui.Input(key='keyMainWindowCiphertext', size=(80, 1)), ],
[simpleGui.Text('文本'), simpleGui.Multiline(key='keyMainWindowMulText', size=(80, 8))],
[simpleGui.Button('加密', key='keyMainWindowEncrypt'),
simpleGui.Button('解密', key='keyMainWindowDecrypt'),
simpleGui.Button('打开新窗口', key='keyMainWindowOpenWindow'), ],
[simpleGui.Button('确定', key='keyMainWindowOk'), simpleGui.Button('取消', key='keyMainWindowCancel')],
]
# 创建窗口,引入布局,并进行初始化。
mainWindow = simpleGui.Window('对称加密演示程序', layout=mainWindowLayout, finalize=True)
# 暂时先不创建window2
window2 = None
# 创建一个事件循环,否则窗口运行一次就会被关闭。
while True:
window, event, values = simpleGui.read_all_windows()
print(window, event, values) # 可以打印一下着看变量的内容
if window == mainWindow:
if event in (simpleGui.WIN_CLOSED, 'keyMainWindowOk', 'keyMainWindowCancel'):#点击主窗口的关闭按钮或者确定按钮或者取消按钮
break
elif event == 'keyMainWindowOpenWindow':
window2 = dealMainWindowOpenWindowEvent(window2)#点击打开新窗口所产生的事件
elif event == 'keyMainWindowEncrypt':
miwen=dealMainWindowEncryptEvent(values)#点击加密产生的事件
mainWindow['keyMainWindowCiphertext'].update(miwen)#在密文框中输出密文
elif event == 'keyMainWindowDecrypt':
mingwen = dealMainWindowDecryptEvent(values) # 点击解密产生的事件
mainWindow['keyMainWindowPlaintext'].update(mingwen) # 在明文框中输出明文
if window == window2:
if event in (simpleGui.WIN_CLOSED, 'keyWindow2Cancel'):#点击窗口2的"取消"所产生的事件
window2.close()
window2 = None
elif event == 'keyWindow2Ok':#点击窗口2的"确定"所产生的事件
window2, newText = dealWindow2OkEvent(window2, values)
text = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + "\n从window2获得文本:\n" + newText
mainWindow['keyMainWindowMulText'].update(text)
# 关闭窗口
mainWindow.close()
if window2 is not None:
window2.close()
except Exception as result:
print("函数 main 捕捉到异常:%s" % result)
if __name__ == '__main__':
main()
半山腰总是最挤的,你得去山顶看看。