- 工具:Anaconda3,python3.5
实验一、 维吉尼亚密码的加密和解密
- 维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
加密
def encrypt(message,key):#加密
cipher = ''
non_alpha_count = 0
for i in range (len(message)):#遍历
if message[i].isalpha():
if message[i].islower():
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
cipher += chr((ord (message[i]) - ord('a') + offset) % 26 + ord('a'))
else:
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
cipher += chr((ord (message[i]) - ord('A') + offset) % 26 + ord('A'))
else:
cipher += message[i]
non_alpha_count += 1
return cipher
- 测试
message = 'Figure out number of sectors to read'
key = 'quick'
print (encrypt(message,key))
解密
def decrypt(cipher,key):#解密
message = ''
non_alpha_count = 0
for i in range (len(cipher)):#遍历
if cipher[i].isalpha():
if cipher[i].islower():
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
message += chr((ord (cipher[i]) - ord('a') - offset) % 26 + ord('a'))
else:
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
message += chr((ord (cipher[i]) - ord('A') - offset) % 26 + ord('A'))
else:
message += cipher[i]
non_alpha_count += 1
return message
- 测试
cipher = 'Vcowbu icv xkgjgb ez agmjizu de lmcn'
key = 'quick'
print (decrypt(cipher,key))
可以证明,加密和解密方式是正确的!
最后,封装
##########Vigenere密码############
#加密函数
def encrypt(message,key):#加密
cipher = ''
non_alpha_count = 0
for i in range (len(message)):#遍历
if message[i].isalpha():
if message[i].islower():
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
cipher += chr((ord (message[i]) - ord('a') + offset) % 26 + ord('a'))
else:
offset = ord(key[(i - non_alpha_count) % len(key)]) - ord('a')
cipher += chr((ord (me