Мой криптоаналитик аффинного шифра не работает 100% времени - PullRequest
0 голосов
/ 02 марта 2019

Мне нужно создать функцию, которая принимает входные данные в виде букв из частотного анализа английского языка «p1» и «p2», а также частотного анализа зашифрованного текста «C1» и «C2», а также длину алфавита я использую "AL".Я создал функцию в Python, чтобы сделать это, но это работает только в некоторых случаях.В других случаях это дает мне ошибку, и я не знаю почему.2 уравнения: s (r + p1) = C1 (mod AL) s (r + p2) = C2 (mod AL)

Код должен вычислять мультипликативный и аддитивный ключи для расшифровки заданногошифр-текст.

Вот мой код - первая функция вычисляет мультипликативное модульное обратное, а вторая функция реализует уравнения.

>>> 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 Ответ

0 голосов
/ 02 марта 2019

Причина в этой строке:

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
...