RSA指数大小

时间:2017-07-28 19:51:24

标签: encryption rsa biginteger

我正在学习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

1 个答案:

答案 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返回0M-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的位数。

因此,作为结论,这证明您的库必须正确处理的位数是模数位数的两倍(如果您使用整数乘法计算取幂的方式在这里解释)。