我正在学习RSA算法。我在非常小的素数上执行算法,并使用在线Big Integer计算器来执行加密和解密,一切正常。
我的问题是关于我们创建的指数的大小,当涉及更大的数字时,计算似乎是不可行的。
例如,算法从选择两个素数p和q开始。你计算n = pxq然后计算n的总数。接下来你选择一个数字' e'这样1
然后执行加密,你可以说像ASCII字符' A'这是65,你把它提升到e的力量。 (65 ^ E)
当e大于100,000(6位数)时,在线大整数计算器开始变得非常缓慢和缓慢(超过一分钟计算)
我的问题是,对于工作RSA算法,该算法选择的是什么大小(位数)数?
我有一个想法是,我使用的在线计算器可能没有使用最好的指数方法吗?这是我正在使用的计算器:http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm
答案 0 :(得分:2)
假设M
是模数。是的,您可以先执行intermediate = 65^e
,然后再计算intermediate mod M
。当然,intermediate
将是一个非常非常非常大的整数(如果e
等于65537,则intermediate
的十进制表示包含118813个数字!)。
但是,归功于一个非常基本的模算术定理,
(65^e) mod M = ((((65 mod M) * 65) mod M) * 65) mod M [...] (e times)
(该定理指出,在商环中,元素类的n次幂是元素的n次幂的类)
如您所见,这不需要任何非常大的整数库,因为在每个算术产品之后,您使用mod M
返回0
和M-1
之间的整数。因此,您只需要计算小于M的整数算术乘积。
作为示例,这是一个简单的shell脚本(bash),它计算65 ^ 65537 mod 991 * 997。 如您所见,无需获得大量数据库:
#!/bin/bash
# set RSA parameters
m=65 # message to encode
M=$((991*997)) # modulus (both 991 and 997 are prime numbers)
e=65537 # public exponent (coprime with 990*996, thus compliant with RSA algorithm)
# compute (m^e) mod M
ret=1
for i in {1..$e}
do
ret=$(((ret*m)%M))
done
# display the result
echo $ret
它立即返回784933
,因此65^65537 mod 991*997 = 784933
使用您的微积分计算的最大整数有118813位数,但使用此shell脚本处理的最大整数只有12位或更少位数((M-1)^2
由12位数字组成)。
根据这些解释,我们现在可以回答您的问题:
我的问题是,对于有效的RSA算法,该算法选择的是什么大小(位数)?
通过上面的解释,你可以看到你必须操作的整数的十进制表示中的最大位数是1+log10((M-1)^2)
,因为你最多会计算{{{}之间的两个整数的乘积。 1}}和0
。
请注意M-1
。另请注意,1+log10((M-1)^2) = 1+2.log10(M-1) < 2+2.log10(M) = 2.(1+log10(M))
是M的位数。
因此,作为结论,这证明您的库必须正确处理的位数是模数位数的两倍(如果您使用整数乘法计算取幂的方式在这里解释)。