Security relies on the difficulty of factoring large
composite numbers
RSA Description
Key Generation
—找到两个大素数 p 和 q, n = pq, φ(n) = (p-1)(q-1)
—随机选择一个e(1<e<φ(n)),且gcd(e,φ(n))
—求出d = e-1mod φ(n),则(e,n)为公钥,(p,q,d)为私钥
Encryption
c = Ee( m) = me(mod n)
Decryption
m = Dd( c) = cd(mod n)
Parameters of RSA
- p和q应该是强素数
若p是强素数,则p-1, p+1有两个大素数因子q1, q2, 且q1-1, q1+1, q2-1, q2+1各有一个大素数因子。
可以防止Pollard p-1 algorithm攻击 - p和q相差不能太大或者太小,太大或者太小都容易被穷举攻击破解
- d >= n1/4, d小一点可以加快解密速度,但是d太小或者太大接近n都容易被穷举破解
RSA Implementations
- xc mod n运算为指数时间,属于NP问题,可以使用平方乘算法
- 如何产生大素数?先产生大奇数,然后进行素数检测。如何进行素数检测?可以使用米勒罗宾算法 (引理:费马小定理、二次探测定理)
Cryptanalysis of RSA
Brute force
Pollard p-1 algorithm
随机选择一个大数B,如果gcd(2B!-1,n)>1,则gcd(2B!-1,n) = p
原理:
已知费马定理2p-1 = 1 mod p
则2p-1-1 =tp,即p|2p-1-1
那么找到2p-1-1就相当于找到p
但是这并没有简化算法,还是在搜索p
p-1是偶数可以分解为素数的乘积p-1 = p1p2p3…pk
则只要整数B>=pk,就有p-1|B!
2B! = 1 mod p,即p|2B!-1
那么gcd(2B!-1,n)=1或者p
即找到B就相当于找到了p
如果直接寻找p,需要先在(1,n1/2)找出素数,再判断该素数是不是n的因子p,而如果寻找B则不需要要求B是素数,直接判断gcd(2B!-1,n)即可,因此可以提高效率。存疑
Pollard Rho algorithm
x1=1, x2=x12+1 mod n
if gcd(x1-x2,n)>1
p=gcd(x1-x2,n)
else loop
x1=x12+1 mod n, x2=(x12+1)2+1 mod n
if gcd(x1-x2,n)>1
p=gcd(x1-x2,n)
break
if p==n
failure
Dixon random square algorithm
找到两个大数X,Y,如果X2=Y2 mod n,且1<gcd(x1-x2,n)<p,则p=gcd(x1-x2,n)
原理:
If x2=y2(mod n), then n | (x-y)(x+y)
• gcd(x-y,n) has a nontrivial factor of n