【问题标题】:Can't handle large integers in Python 3无法在 Python 3 中处理大整数
【发布时间】:2017-07-07 12:27:28
【问题描述】:

我正在尝试实现一个非常简单的 RSA 算法,当我选择 2 个大于 3 位的素数时,当我尝试解密消息时,我的 IDE 冻结,我认为因为它是一个 bigInt,所以我一直在等待大约 10 分钟,什么也没发生。

这是我的代码:

def gcd (m,n):
if (m%n ==0):
    return n
else:
    return gcd(n,m%n)

def extended_gcd(aa, bb):
    lastremainder, remainder = abs(aa), abs(bb)
    x, lastx, y, lasty = 0, 1, 1, 0
    while remainder:
          lastremainder, (quotient, remainder) = remainder,      divmod(lastremainder, remainder)
    x, lastx = lastx - quotient*x, x
    y, lasty = lasty - quotient*y, y
return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)

def modinv(a, m):
g, x, y = extended_gcd(a, m)
if g != 1:
    raise ValueError
return x % m
p = 9883
q = 9887
n = p*q
phi = (p-1)*(q-1)
e = 509

    m = 320

    d = modinv(e,phi)
    c = (pow(m,e)%n) 
    msg = pow(c,d) % n ## MY IDE FREEZES WHEN IT REACHES THIS LINE! SURE OF IT
    print(msg)  

【问题讨论】:

  • python 中的函数调用很昂贵,为每个函数创建一个新的堆栈帧并将其压入堆栈。使用 CPython 解释器执行递归方法效率非常低,考虑使用 PyPy 执行此操作,您将看到巨大的性能优势(由于 JIT 优化)。

标签: python encryption rsa


【解决方案1】:

你的线路:

c = (pow(m,e)%n)

应该是:

c = (pow(m,e,n))

根据official documentation,这是一种更有效地计算大量模数的方法

编辑:同样的事情:

msg = pow(c,d) % n

变成:

msg = pow(c,d, n)

关于大小,Python 实际上对整数非常聪明,如果数字太大而无法容纳传统整数,它会切换内部表示。因此,大小通常不是问题

【讨论】:

  • 哇!这就是问题所在!感谢一百万罗西先生!
猜你喜欢
  • 2018-10-04
  • 2010-10-31
  • 2020-11-19
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2016-06-28
  • 1970-01-01
相关资源
最近更新 更多