我正在通过python 3模拟用于公共和私有密钥设置的RSA协议,我必须处理大量的指数。由于pow(base,exp)
似乎在合理的时间内无法运行,因此我一直在尝试使用其他算法,但目前看来似乎没有任何效果。
到目前为止,哪种算法最有效?
答案 0 :(得分:2)
通过对前一个二进制幂进行平方运算来计算基本模n的二进制幂。 base ^ 2 = base ^ 1 * base ^ 1; base ^ 4 = base ^ 2 * base ^ 2
“二进制”是指base ^ 0,base ^ 1,base ^ 2,base ^ 4,base ^ 8等。
然后将指数中的该位设置为二进制数的倍数。
例如指数9:base ^ 9 = base ^ 1 * base ^ 8。 所有计算均以模n为单位。
查找附带的伪代码;我希望它是正确的,因为它未经测试;
//pseudocode
function myPower(base, exponent, n) {
power = 1;
binarypower = base;
while(exponent>0) {
if(exponent&1 != 0) {
power = (binarypower * power) %n;
}
exponent = exponent>>1;
if(exponent>0) {
binarypower = (binarypower*binarypower)%n;
}
}
return power;
}
答案 1 :(得分:1)
首先,标题的答案是 unknown 。这个问题很难解决,您可以详细了解in this Wikipedia article。实际上,几乎所有人都使用exponentiation by squaring,包括Python的算法。
但是在RSA中,您使用的是模幂,我希望那是您要出错的地方。如果您计算pow(base, exp) % mod
,由于中间指数的增加,这将非常慢。诀窍是减少每一步的取幂,这是因为a * b mod m == ((a mod m) * (b mod m)) mod m
是允许的。这已经在Python中通过使用内置三个参数的pow
函数(不是 math.pow
,而是内置pow
)实现了: pow(base, exp, mod)
。结果等于pow(base, exp) % mod
,但是对于大指数来说,此功能要快得多。
最后,对于以大量模为模的固定模进行非常大的计算,将数字以蒙哥马利形式并使用Montgomery reduction可能是有益的。但是,这是一种更高级的数论,您不需要。