【问题标题】:How can I prevent Python from automatically converting int to float when I use pow and mod?当我使用 pow 和 mod 时,如何防止 Python 自动将 int 转换为 float?
【发布时间】:2019-10-22 15:56:44
【问题描述】:

我正在尝试使用公式 c = m^p mod q 使用 rsa 进行加密。 问题是如果数字太大,python3在做模时将其转换为浮点数。

我试图通过转换为 int 来停止转换

c = int(int((pow(n,p)) % q))

问题是当 p 太大时它自动有小数并且 python 认为,我正在尝试整数浮动。这导致了这一点:

OverflowError: int too large to convert to float

有没有办法解决这个问题?

【问题讨论】:

  • 不要明确计算pow(n,p),因为无论如何你都会去mod q
  • 你是使用内置的pow函数还是math.pow
  • 如果您使用的是内置的pow,那么我唯一的猜测是npq 之一不是整数,因此这些操作将其他参数浮动,导致错误。
  • 使用 pow 的 3 参数形式 pow(n, p, q) 进行模幂运算。这更有意义,如果由于某种原因你从math 导入了pow,你会得到一个错误。
  • 三个参数pow 如果任何参数不是整数,也会引发错误,这是我能想到的唯一导致此错误的其他原因。

标签: python-3.x rsa


【解决方案1】:

这可能无法解决您的问题,但它确实解决了您在问题中提出的具体问题,并根据您告诉我们的内容提出了可能的原因。


您遇到的问题不在于%。根据the documentation

楼层除法和模运算符通过以下标识连接:x == (x//y)*y + (x%y)

给定整数xy(x//y)*y 始终是一个精确整数,所以x - (x//y)*y == x%y 也必须是一个整数。


既然你说你使用的是内置的pow 函数,我怀疑你的问题是你的输入是浮点数而不是整数。在这种情况下,pow** 都会尝试将另一个参数转换为float,这可能是您的错误的根源。如果是这种情况,将每个参数包装在 int 中将使错误消失,但您的 RSA 实现将不正确。

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 2017-03-08
    • 2010-11-20
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多