




alpha = [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]
alpha_inverse = [1, 9, 21, 15, 3, 19, 7, 23, 11, 5, 17, 25]
# 暴力破解仿射加密
def baoli(mi):
ans = ""
# 遍历alpha_inverse列表
for j in range(len(alpha_inverse)):
# 遍历0到25的beta列表
for k in range(26):
# 遍历密文中的每个字符
for i in range(len(mi)):
# 如果字符为空格,将空格添加到结果字符串
if mi[i] == ' ':
ans += ' '
# 如果字符是小写英文字母
elif mi[i].islower():
# 计算字符的偏移量
cur = ord(mi[i]) - ord('a') - k
# 解密并将解密后的字符添加到结果字符串
if cur >= 0:
ans += chr(((cur * alpha_inverse[j]) % 26) + ord('a'))
else:
ans += chr(((26 + cur) * alpha_inverse[j]) % 26 + ord('a'))
# 如果字符是大写英文字母
elif mi[i].isupper():
# 计算字符的偏移量
cur = ord(mi[i]) - ord('A') - k
# 解密并将解密后的字符添加到结果字符串
if cur >= 0:
ans += chr(((cur * alpha_inverse[j]) % 26) + ord('A'))
else:
ans += chr(((26 + cur) * alpha_inverse[j]) % 26 + ord('A'))
# 如果字符不是字母,将字符直接添加到结果字符串
else:
ans += mi[i]
print("α逆=", alpha_inverse[j], ",β=", k, "时的明文:", ans)
# 清空结果字符串,用于下一组合结果存储
ans = ""
密文:Ptfxgj Jnno-afv wn Htzaixojv Tjtxg

定义一个空字符串ans,用于存储解密后的明文。
创建一个列表b,用于记录每个字母在密文中出现的次数,初始值都为0。

遍历alpha_inverse列表和0到25的beta列表,找到满足条件的alpha_inverse和beta。
if (((alpha[j] * 4 + k) % 26) == (ord(maxchar) - ord('a'))) and (((alpha[j] * 19 + k) % 26) == (ord(secondchar) - ord('a')))

# 使用词频统计方式破解仿射加密
def count(mi):
ans = ""
# 用于记录每个字母在密文中出现的次数的列表
b = [0] * 26
# 遍历密文中的每个字符统计出现次数
for i in range(len(mi)):
if mi[i].islower():
b[ord(mi[i]) - ord('a')] += 1
elif mi[i].isupper():
b[ord(mi[i]) - ord('A')] += 1
# 出现次数最多的字母
maxchar = ''
# 最大出现次数
time_max = 0
# 最大出现次数字母的索引
index = 0
# 遍历26个字母找最大出现次数的字母
for i in range(26):
if b[i] > time_max:
maxchar = chr(i + ord('a'))
time_max = b[i]
index = i
# 将最大出现次数字母的次数置为0,排除对找次常出现字母的干扰
b[index] = 0
# 找次常出现字母
secondchar = ''
time_secmax = 0
for i in range(26):
if b[i] > time_secmax:
secondchar = chr(i + ord('a'))
time_secmax = b[i]
# 解密的密钥alpha_inverse
key_alpha = 0
# 解密的密钥beta
beta = 0
# 遍历alpha_inverse列表
for j in range(len(alpha_inverse)):
# 遍历0到25的beta列表
for k in range(26):
# 如果找到满足条件的alpha_inverse和beta
if (((alpha[j] * 4 + k) % 26) == (ord(maxchar) - ord('a'))) and (((alpha[j] * 19 + k) % 26) == (ord(secondchar) - ord('a'))):
# 更新解密的密钥alpha_inverse
key_alpha = alpha_inverse[j]
# 更新解密的密钥beta
beta = k
break
# 遍历密文中的每个字符,解密
for i in range(len(mi)):
if mi[i] == ' ':
ans += ' '
elif mi[i].islower():
cur = ord(mi[i]) - ord('a') - beta
if cur >= 0:
ans += chr(((cur * key_alpha) % 26) + ord('a'))
else:
ans += chr(((26 + cur) * key_alpha) % 26 + ord('a'))
elif mi[i].isupper():
cur = ord(mi[i]) - ord('A') - beta
if cur >= 0:
ans += chr(((cur * key_alpha) % 26) + ord('A'))
else:
ans += chr(((26 + cur) * key_alpha) % 26 + ord('A'))
else:
ans += mi[i]
return ans
最高频对应e,次高频对应t

加密(x) = (alpha * x + beta) mod 26,其中mod 26表示对26取模运算。解密则是加密的逆运算:解密(y) = alpha_inverse * (y - beta) mod 26,其中alpha_inverse表示alpha的逆元。