Мой криптоаналитик аффинного шифра не работает 100% времени
Я должен создать функцию, которая принимает входные данные в виде букв из частотного анализа английского языка, "p1" и "p2", а также частотного анализа зашифрованного текста, "C1" и "C2", а также в качестве длины алфавита я использую "AL". Я создал функцию в Python, чтобы сделать это, но это работает только в некоторых случаях. В других случаях это дает мне ошибку, и я не знаю почему. 2 уравнения: s(r+p1)=C1(mod AL) s(r+p2)=C2(mod AL)
Код должен вычислять мультипликативный и аддитивный ключи для дешифрования заданного зашифрованного текста.
Вот мой код - первая функция вычисляет мультипликативное модульное обратное, а вторая функция реализует уравнения.
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).
1 ответ
Причина в этой строке:
return 'These are not co-prime.'
%
Оператор выполняет операцию по модулю при применении к целым числам.
Применительно к строкам он выполняет форматирование строк. В случае, когда аргументы предоставлены ModInverse
не взаимно просты, он возвращает строку, которая r = p8 % AL
пытается отформатировать. Поскольку возвращаемая строка не содержит спецификаторов формата, она вызывает исключение.
Вместо того, чтобы возвращать строку в такой ситуации, вы должны вызвать собственное исключение, например:
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