不明白我收到的错误?

时间:2019-03-05 02:01:15

标签: python python-3.x cryptography cryptanalysis

我具有已大大简化的此功能,该功能可计算用于解密仿射密码的乘法和加法密钥,在某些情况下它可以工作,但是在这种情况下,它会向我抛出错误,并且我不确定为什么。这是我的代码:

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 :(得分:3)

InverseMod()中,您放置了一个条件,如果这些计算结果不是素数则返回“ A string”。这样该函数将返回一个字符串,并且r语句变为

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

哪个不正确

返回0或执行一些if条件来解决

答案 1 :(得分:1)

此函数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))