我想自己计算RSA算法。我需要计算一定功率下的数的模数。问题是那个特定能量的数字会变得很大。
这就是我想要的:
x = pow(n, p) % q
如何有效地确定x?
答案 0 :(得分:7)
如果您使用的是.NET 4,我建议您查看BigInteger
,它甚至提供了ModPow
方法,可以在一次操作中完成所有操作:)
BigInteger n = ...;
BigInteger p = ...;
BigInteger q = ...;
BigInteger x = BigInteger.ModPow(n, p, q);
答案 1 :(得分:7)
function modular_pow(base, exponent, modulus)
c := 1
for e_prime = 1 to exponent
c := (c * base) mod modulus
return c
通过平方化应用取幂可以提高效率:
function modular_pow(base, exponent, modulus)
result := 1
while exponent > 0
if (exponent & 1) equals 1:
result = (result * base) mod modulus
exponent := exponent >> 1
base = (base * base) mod modulus
return result
答案 2 :(得分:2)
答案 3 :(得分:1)
...中平凡
x = 1
for(i = 0; i < p; i++)
x = (x*n) % q
更有效的方式,如二进制求幂而不是这种天真的迭代,但这确实超过了溢出问题,因为x受n * q的限制
答案 4 :(得分:1)
请参阅BigInteger.ModPow
(Fx 4+),此处为MSDN。
答案 5 :(得分:0)
如果您打算编写自己的Modpow()
版本:
您只需要模q的幂,因此您的计算不需要使用大于q^2
的任何数字,使用以下事实:
if a = b (mod q) then a*p = b*p (mod q)
因此,在计算幂n^p
时,在每次乘法后,对工作变量执行(模q)运算。
此外,如果q是素数,你可以使用费马的小定理,其中指出:
a^(q-1) = 1 (mod q)
(when a is not a multiple of q)
当p
(大于)q
答案 6 :(得分:0)
尽管这里提供的所有答案都是正确的,但我错误地使用了明显的平方和乘法算法,这是实现模幂运算的“经典”方法。