我的仿射密码 cryptanalyis 不是 100% 的时间工作
My cryptanalyis of an affine cipher isn't working 100% of the time
我必须创建一个函数,该函数将英语 "p1" 和 "p2" 的频率分析以及密文的频率分析作为字母输入,"C1" 和 "C2",以及我使用的字母长度 "AL"。我在 Python 中创建了一个函数来执行此操作,但它只在某些时候有效。其他时候它会给我一个错误,我不知道为什么。
这两个方程是:
s(r+p1)=C1(mod AL)
s(r+p2)=C2(mod AL)
该代码应该计算用于解密给定密文的乘法和加法密钥。
这是我的代码 - 第一个函数计算乘法 mod 元逆函数,第二个函数实现方程。
def ModInverse(a, m):
if gcd(a, m) != 1:
return 'These are not co-prime.'
# Calculate using the Extended Euclidean Algorithm:
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % m
def decryption_keys_affine(p1, p2, C1, C2, AL):
s = p2 - p1
p3 = s * p1
p4 = (p3 % AL)
p5 = C1 - p4
p6 = AL + p5
p7 = ModInverse(s, AL)
p8 = p7 * p6
r = p8 % AL
multi = ModInverse(s, AL)
add = AL - r
print(multi, add)
当我给它这个输入时:
>>> decryption_keys_affine(5, 20, 9, 26, 26)
7 20
>>>
它显示正确的答案。
当我给它这个输入时:
>>> decryption_keys_affine(5, 20, 41, 18, 42)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
decryption_keys_affine(5, 20, 41, 18, 42)
File "C:\Users\Herman\Desktop\crypto_math_functions.py", line 108, in decryption_keys_affine
r = p8 % AL
TypeError: not all arguments converted during string formatting
它给了我那个错误,我不知道为什么。 (第一个字母表长度为 26,第二个字母表包括 10 个数字和 6 个符号,使其为 42)。
原因是这一行:
return 'These are not co-prime.'
%
运算符在应用于整数时执行模运算 。
当应用于 字符串 时,它会执行字符串格式化。在提供给 ModInverse
的参数不是互质的情况下,它 return 是一个字符串,r = p8 % AL
尝试对其进行格式化。由于 return 字符串不包含格式说明符,因此会引发异常。
在这种情况下,您不应 return 处理字符串,您应该提出自己的异常,例如:
def ModInverse(a, m):
if gcd(a, m) != 1:
raise ValueError('The input arguments, {} and {}, are not coprime.'.format(a, m))
# Calculate using the Extended Euclidean Algorithm:
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % m
我必须创建一个函数,该函数将英语 "p1" 和 "p2" 的频率分析以及密文的频率分析作为字母输入,"C1" 和 "C2",以及我使用的字母长度 "AL"。我在 Python 中创建了一个函数来执行此操作,但它只在某些时候有效。其他时候它会给我一个错误,我不知道为什么。 这两个方程是: s(r+p1)=C1(mod AL) s(r+p2)=C2(mod AL)
该代码应该计算用于解密给定密文的乘法和加法密钥。
这是我的代码 - 第一个函数计算乘法 mod 元逆函数,第二个函数实现方程。
def ModInverse(a, m):
if gcd(a, m) != 1:
return 'These are not co-prime.'
# Calculate using the Extended Euclidean Algorithm:
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % m
def decryption_keys_affine(p1, p2, C1, C2, AL):
s = p2 - p1
p3 = s * p1
p4 = (p3 % AL)
p5 = C1 - p4
p6 = AL + p5
p7 = ModInverse(s, AL)
p8 = p7 * p6
r = p8 % AL
multi = ModInverse(s, AL)
add = AL - r
print(multi, add)
当我给它这个输入时:
>>> decryption_keys_affine(5, 20, 9, 26, 26)
7 20
>>>
它显示正确的答案。
当我给它这个输入时:
>>> decryption_keys_affine(5, 20, 41, 18, 42)
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
decryption_keys_affine(5, 20, 41, 18, 42)
File "C:\Users\Herman\Desktop\crypto_math_functions.py", line 108, in decryption_keys_affine
r = p8 % AL
TypeError: not all arguments converted during string formatting
它给了我那个错误,我不知道为什么。 (第一个字母表长度为 26,第二个字母表包括 10 个数字和 6 个符号,使其为 42)。
原因是这一行:
return 'These are not co-prime.'
%
运算符在应用于整数时执行模运算 。
当应用于 字符串 时,它会执行字符串格式化。在提供给 ModInverse
的参数不是互质的情况下,它 return 是一个字符串,r = p8 % AL
尝试对其进行格式化。由于 return 字符串不包含格式说明符,因此会引发异常。
在这种情况下,您不应 return 处理字符串,您应该提出自己的异常,例如:
def ModInverse(a, m):
if gcd(a, m) != 1:
raise ValueError('The input arguments, {} and {}, are not coprime.'.format(a, m))
# Calculate using the Extended Euclidean Algorithm:
u1, u2, u3 = 1, 0, a
v1, v2, v3 = 0, 1, m
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % m