Не понимаю ошибку, которую я получаю? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть эта функция, которую я значительно упростил, которая вычисляет мультипликативные и аддитивные ключи для дешифрования аффинного шифра, и она работает в некоторых случаях, но есть один случай, когда он выдает мне ошибку, и я не уверен, почему.Вот мой код:

def InverseMod(a, m):
    for i in range(1,m):
        if ( m*i + 1) % a == 0:
            return ( m*i + 1) // a
    return 'These are not co-prime.'

def decryption_keys_affine(p1, p2, C1, C2, AL):

    s = InverseMod(p1 - p2, AL) * (C1 - C2)

    r = (InverseMod(s, AL) * C2 - p2) % AL

    print("INV(S):", InverseMod(s, AL), "\n" + "R:", r)

Когда я даю ему этот ввод, он выводит правильные ответы, которые являются 17 и 26:

>>> decryption_keys_affine(3, 20, 19, 20, 42)
INV(S): 17 
R: 26

Когда я даю ему этот ввод, онвыдает мне эту ошибку:

>>> decryption_keys_affine(5, 20, 9, 26, 26)
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    decryption_keys_affine(5, 20, 9, 26, 26)
  File "C:\Users\Herman\Desktop\crypto_math_functions.py", line 96, in decryption_keys_affine
    r = (InverseMod(s, AL) * C2 - p2) % AL
TypeError: unsupported operand type(s) for -: 'str' and 'int'

Должен вывести:

>>> decryption_keys_affine(5, 20, 9, 26, 26)
INV(S): 7 
R: 20

Ответы [ 2 ]

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

Эта функция InverseMod возвращает разные типы для разных случаев.Если вы не проходите тест if в цикле или цикл не выполняется, вместо этого вы возвращаете строку.

def InverseMod(a, m):
    for i in range(1,m):
        if ( m*i + 1) % a == 0:
            return ( m*i + 1) // a
    return 'These are not co-prime.'

В общем, этот тип поведения должен вместо этого моделироваться с помощьюисключение.

Если бы это было так, режим сбоя был бы более очевидным.

def InverseMod(a, m):
    for i in range(1,m):
        if ( m*i + 1) % a == 0:
            return ( m*i + 1) // a
    raise  ValueError('"{}" and "{}" are not co-prime'.format(a, m))
0 голосов
/ 05 марта 2019

В InverseMod() вы поставили условие, если эти вычисления не являются простыми, возвращают "Строка".Таким образом, эта функция возвращает String, и оператор r становится похожим на

r = ("String" * int - int) % int

, что неверно

Либо возвращаем 0, либо выполняем некоторые if условия длярешить это

...