Python RSA加密和解密不正确,消息较大

Python RSA加密和解密不正确,消息较大,python,encryption,cryptography,rsa,Python,Encryption,Cryptography,Rsa,我最近对RSA感兴趣,并尝试实现它。 这是我的代码的简化版本: def egcd(a, b): if a == 0: return (b, 0, 1) else: g, x, y = egcd(b % a, a) return (g, y - (b // a) * x, x) def modinv(b, n): g, x, _ = egcd(b, n) if g == 1: return x % n

我最近对RSA感兴趣,并尝试实现它。 这是我的代码的简化版本:

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, x, y = egcd(b % a, a)
        return (g, y - (b // a) * x, x)

def modinv(b, n):
    g, x, _ = egcd(b, n)
    if g == 1:
        return x % n

p = 89
q = 107
n = p * q
phi = (p - 1) * (q - 1)
e = 3
d = modinv(e, phi)

message = 74
encrypted = (message**e) % n
decrypted = (encrypted**d) % n

print(message)
print(encrypted)
print(decrypted)
对于较小的消息,本例中使用了74,它可以正常工作。 但是,当设置
message=120000
或任何其他大值时,结果如下:

120000
147
5724
因此,我在上的RSA计算器中输入了完全相同的值。 这还导致消息解密错误


这里有什么问题?这是数学问题还是python问题?提前感谢。

RSA以n模工作。因此,消息不能大于或等于n。这可以通过增加素数p和q的大小来解决。生成大素数的一种简单方法是使用rabin-miller素性测试。你可以在这里阅读更多关于该测试的内容

另外,还有一点,在代码中

(message ** e) % n
虽然这对于小值来说很快,但使用内置的
pow
功能要快得多

pow(message, e, n)

RSA在模n下工作。因此,消息不能大于或等于n。这可以通过增加素数p和q的大小来解决。生成大素数的一种简单方法是使用rabin-miller素性测试。你可以在这里阅读更多关于该测试的内容

另外,还有一点,在代码中

(message ** e) % n
虽然这对于小值来说很快,但使用内置的
pow
功能要快得多

pow(message, e, n)

它都是以模
n
方式工作的,因此只有
0
n-1
范围内的“消息”才可能工作。对于您来说,
n=89*107=9523
,因此不可能恢复任何大于9522的“消息”。谢谢!因此,为p和q选择更大的值可以解密更大的消息。是的-尽管更大的
n
的真正意义在于使
n
(这是公钥的一部分!它不是秘密)更难考虑。任何
n
都可以用来发送任何大小的消息-只需将大型消息视为,例如,以
n
为基数的整数,并一次加密一个“数字”。它都是按
n
模工作的,因此只有
0
n-1
范围内的“消息”才可能工作。对于您来说,
n=89*107=9523
,因此不可能恢复任何大于9522的“消息”。谢谢!因此,为p和q选择更大的值可以解密更大的消息。是的-尽管更大的
n
的真正意义在于使
n
(这是公钥的一部分!它不是秘密)更难考虑。Any
n
可用于发送任意大小的消息-只需将大型消息视为,例如,作为基数
n
中的整数,并一次加密一个“数字”。