Не понимаете, какую ошибку я получаю?

#python #python-3.x #cryptography #cryptanalysis

#python #python-3.x #криптография #криптоанализ

Вопрос:

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

 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:UsersHermanDesktopcrypto_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
  

Комментарии:

1. Обратная трассировка говорит, что эта строка — r = (InverseMod(s, AL) * C2 - p2) % AL — вызывает ошибку. Я полагаю, что в этот момент p2 стало str , и результатом (InverseMod(s, AL) * C2 является int — или наоборот. Распечатайте данные только для этого оператора, чтобы увидеть, что это такое, или перехватите ошибку и проверьте / распечатайте соответствующие данные в наборе except. Возможно, подумайте об изучении модуля pdb .

2. @the4horsemen второй ввод, выдающий ошибку, пытается вычислить вычитание между str и int : r = ('These are not co-prime.' - p2) % AL

Ответ №1:

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

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

Что неверно

Либо верните 0, либо выполните некоторые if условия для ее решения

Ответ №2:

Эта функция 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))