RSA算法
传统方式计算RSA
1.公私钥计算
(1) 计算 n = p x q ;
(2) 计算Φ(n)= (p-1) x (q-1);
(3) 选择 e ,且e与Φ(n)互素 ;
(4) 确定d x e= 1 mod Φ(n);
(5) 确定公钥 PU = {n , d}, 私钥 PR = {n,e}
2.加解密
明文M ;加密Y= M^e mod n;
解密 M = Y^d mod n;
由于原版的RSA算法在解密的时候,需要用到公式c^d = m,若d过大则会导致解密时间过长,因此可以使用中国剩余定理降低解密时次幂计算时的阶。
首先n可以分解成p和q,之后根据中国剩余定理,有m=m1 mod p、m = m2 mod q,这样可以直接把解密的模数从n降为p和q。接着,为了减少次解密时乘法的次幂数,根据我之前写BUUCTF的RSA1的题目的步骤来看,可以令dp = d mod (p-1),dq = d mod (q-1)(注意,这里之所以选p-1作为模数,是因为p-1是Φ(n)的因子之一满足欧拉定理),
1. 根据中国剩余定理,可知m1 = c^d mod p; m2 = c^d mod q,因此c^d = kp + m1, m2= (kp + m1) mod q , m2 - m1= kp mod q ;
2. 由于p和q互素,因此可以得出(m2-m1)p-1 = k mod q,经过公式转换可以得出k = (m2 - m1) p-1 mod q,将k代入公式cd = kp + m1,得出等式cd =(( (m2-m1)p-1modq)p + m1)mod n ;
3. 由公式5、6得出d = dp mod ( p − 1 ),d= dq mod ( q − 1 ) ,将其代入m1 = c^d mod p和m2 = c^d mod q ;
4. 最终得到明文表达式m = (((m2−m1) ∗p−1 mod q) p + m1) mod n = (((c^dp mod ( p − 1 ) mod q−c^dq mod ( q − 1 ) mod p) ∗p−1 mod q) p + c^dp mod ( p − 1 )mod p) mod n。
那么d = k1*(q-1) +dp,带入解密公式,可得c^d mod p =c^(k1(p-1) +dp) mod p=c^dp * c^(k1(p-1)) mod p,因为 c^(p-1) mod p = 1 (欧拉定理)= c^k1 mod p,这样就成功降解密的次幂阶从d降到了k1,这里的k1 = d mod dp,这么看是不是很巧呢?这里不光是dp,还可以用dq(dq = d mod (q-1),即d = dq mod (q-1)),来降低d,总之是个很灵活的事。