Python: 用于 El Gamal 解密的大浮点运算

Python: Large float arithmetic for El Gamal decryption

上下文

El Gamal方法的解密数学公式如下:

m = ab^(-k) mod p

特别是在 Python 中,我想计算以下等价物:

>>> m = (b**(-k) * a) % p

上述 Python 代码中的问题在于,由于精度原因,插入的数字会溢出或导致 0.0。考虑以下示例:

>>> (15653**(-3632) * 923) % 262643
0.0

上述示例的预期答案是 152015。

更多示例

尝试

我试图研究一种策略来处理这个问题,发现使用 Python 的默认 pow(x,y,z),它不同于 math.pow(),可以提供帮助。

pow(x,y,z) 等价于 x**y % z

但是,我无法使用pow(x,y,z)。我尝试使用 pow(15653, -3632, 262643),但我无法将 pow(15653, -3632) 的结果乘以 923然后,作为最后一步,mod by 262643.

换句话说,我尝试执行 (x**y * a ) % z[= 而不是 x**y % z 51=],但显然有一个 3 参数限制或来自 pow(x,y,z) 的操作数。

如何计算 Python 中的数学公式?

非常简单:只需将两者相乘,然后显式计算 mod:

>>> p = 262643
>>> pow(15653, -3632, p)
86669
>>> 86669 * 923 % p
152015

完成!