Affine密码是一种替换密码,它使用以下数学公式来加密字符:
$$E(x) = (a \cdot x + b) \mod m$$
其中:E(x) 是加密后的字符。
x是原始字符(通常是从0开始的数字,例如,’a’ 对应 0, ‘b’ 对应 1,依此类推)。
a和 b是密钥。
m是字母表的大小(对于英文字母,m = 26 )。
解密过程使用以下公式:
$$D(y) = a^{-1} \cdot (y - b) \mod m$$
其中:
D(y) 是解密后的字符,y 是加密后的字符。
$$a^{-1}$$是a在模m下的乘法逆元,即满足$$a \cdot a^{-1} \equiv 1\ mod\ m$$的数。
在Affine密码中,为了确保a有乘法逆元,a必须与m互质。如,对于英文字母,a必须与26互质。
下面给出爆破脚本。
import math
def affine_decrypt(ciphertext, a, b, m=26):
# 解密函数
plaintext = ''
for char in ciphertext:
if char.isalpha(): # 只处理字母
# 将字符转换为0-25的范围
char_value = ord(char.lower()) - ord('a')
# 应用Affine解密公式
decrypted_value = (a * char_value - b) % m
# 转换回字符
plaintext += chr(decrypted_value + ord('a'))
else:
# 非字母字符保持不变
plaintext += char
return plaintext
def crack_affine(ciphertext):
# 爆破Affine cipher
for a in [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]:
for b in range(26):
# 检查a和26是否互质
if math.gcd(a, 26) == 1:
decrypted_text = affine_decrypt(ciphertext, a, b)
print(f"Key (a={a}, b={b}) -> Decrypted text: {decrypted_text}")
# 给定的密文
ciphertext = "pii1c3_jv_1ce3m3vejcr"
crack_affine(ciphertext)
这个Python脚本定义了两个函数:affine_decrypt 和 crack_affine。它们用于解密使用Affine密码加密的文本。
affine_decrypt 函数:
接受四个参数:ciphertext(密文),a 和 b(Affine密码的密钥),以及 m(字母表的大小,默认为26)。
函数通过遍历密文中的每个字符来解密文本。
对于每个字母字符,它首先将其转换为0-25的范围,然后应用Affine解密公式 (a * char_value - b) % m 来解密字符。
对于非字母字符,它保持不变。
函数返回解密后的明文。
crack_affine 函数:
接受一个参数:ciphertext(密文)。
函数通过遍历所有可能的 a 和 b 值来尝试破解Affine密码。
a 的值是从给定的列表中选取的,而 b 的值是从0到25。
对于每个密钥组合,它检查 a 和26是否互质(使用 math.gcd 函数)。
如果它们互质,函数使用 affine_decrypt 函数解密密文,并打印出密钥和解密后的文本。
脚本的最后部分:
定义了一个密文 ciphertext。
调用 crack_affine 函数来尝试破解这个密文。
这个脚本是一个简单的Affine密码破解器。Affine密码是一种替换密码,它使用公式 (a * char_value + b) % m 来加密字符,其中 a 和 b 是密钥,m 是字母表的大小。解密公式是 (a * char_value - b) % m。由于 a 必须与 m 互质,所以脚本中只尝试了与26互质的 a 值。
运行结果如下:
Key (a=1, b=0) -> Decrypted text: pii1c3_jv_1ce3m3vejcr
Key (a=1, b=1) -> Decrypted text: ohh1b3_iu_1bd3l3udibq
……(省略)
Key (a=3, b=18) -> Decrypted text: bgg1o3_jt_1ou3s3tujoh
Key (a=3, b=19) -> Decrypted text: aff1n3_is_1nt3r3sting
Key (a=3, b=20) -> Decrypted text: zee1m3_hr_1ms3q3rshmf
……(省略)
Key (a=25, b=25) -> Decrypted text: mtt1z3_sg_1zx3p3gxszk
注意到:当a=3,b=19时,解出了有意义的结果。