仿射密码在不知道密钥的情况下只有312种可能,很方便我们进行遍历,下面粘贴上写好的代码
'''
仿射密码在不知道k1和k2的情况下总共312种可能
'''
# import math
# list = []
# for i in range(26):
# if math.gcd(i,26) == 1:
# list.append(i)
# print(list)
# print(len(list)*26)
# 结果是312
from gmpy2 import invert
import string
import fastReconization
letters = list(string.ascii_lowercase)
nums = []
for num in range(26):
nums.append(num)
#创建一个查询字典
query_dict = dict(zip(letters,nums))
reverse_query_dict = dict(zip(nums,letters))
def decrption(c,k2,inverse):
result_list = []
for x in c:
if x in string.ascii_lowercase:
x1 = query_dict[x]
result = reverse_query_dict[((x1 - k2) * inverse) % 26]
result_list.append(result)
else:
result_list.append(x)
print(f'k1为{k1},k2为{k2}时,明文为: ' + (''.join(result_list)))
text = [''.join(result_list)]
# fastReconization.quickRec(text,10)
if __name__ == '__main__':
c = input('请输入密文: ').lower()
k1_list = [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
k2_list = [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]
for k1 in k1_list:
for k2 in k2_list:
# c = 'lbf'
# #要算出k1的逆元
# k1 = 7
# k2 = 3
inverse = invert(k1, 26)
decrption(c, k2, inverse)