RSA加密算法是第一个能同时用于消息传输和数字签名的算法,是目前被研究和使用最广泛的加密算法。
1.密钥生成阶段
Step 1. 随机选择多个数值不同的强素数 p 1 , p 2 , ⋯ p n p_1,p_2,\cdots p_n p1,p2,⋯pn;
Step 2.计算模数 N = p 1 × p 2 ⋯ × p n N = p_1\times p_2\cdots \times p_n N=p1×p2⋯×pn;
Step 3. 计算模数 N N N的欧拉函数 φ ( N ) = ( p 1 − 1 ) × ( p 2 − 1 ) ⋯ × ( p n − 1 ) \varphi(N)=(p_1-1)\times (p_2-1)\cdots \times (p_n-1) φ(N)=(p1−1)×(p2−1)⋯×(pn−1);
Step 4. 随机选取一个正整数 e e e作为公钥,公钥满足尽可能大, 1 < e < φ ( N ) 1 < e < \varphi(N) 1<e<φ(N)且 g c d ( e , φ ( N ) ) = 1 gcd(e,\varphi(N))=1 gcd(e,φ(N))=1;
Step 5. 根据 e d ≡ 1 ( m o d φ ( N ) ) ed\equiv 1(mod\ \varphi(N)) ed≡1(mod φ(N)),求得 e e e关于 φ ( N ) \varphi(N) φ(N)的模逆元素,即,私钥 d d d。
在密钥生成过程结束后,可获得公钥 ( e , N ) (e,N) (e,N)和私钥 ( d , N ) (d,N) (d,N)。将公钥发送给所有需要进行通讯的对象,保密 p 1 , p 2 , ⋯ p n p_1,p_2,\cdots p_n p1,p2,⋯pn和 φ ( N ) \varphi(N) φ(N)。私钥由持有者保管好,防止泄露造成攻击。
2.明文消息 M M M加密阶段
C = M e m o d N C = M^e\ mod\ N C=Me mod N
3.密文消息 C C C解密阶段
M = C d m o d N M = C^d\ mod\ N M=Cd mod N
运用多素数RSA加密算法进行解密时需要进行 s s s次指数长度为 n / s n/s n/s bit位的指数运算。传统RSA加密算法再使用BR算法计算时时间复杂度为 O ( l o g ( d ) l o g 2 ( n ) ) O(log(d)log^2(n)) O(log(d)log2(n)), 当 d d d很大与 n n n同数量级时,复杂度可以认为是 O ( l o g 3 ( n ) ) O(log^3(n)) O(log3(n))。在效率提高的倍数为: α = l o g 3 ( n ) / l o g 3 ( n / s ) \alpha=log^3(n)/log^3(n/s) α=log3(n)/log3(n/s)。
在使用RSA加密算法对密文消息进行解密时采用中国剩余定理。首先,将RSA加密算法中的解密运算由计算模数 N N N的指数形式转化为求解用于方程组的形式,这样可以利用扩展欧几里得算法或利用中国剩余定理进行求解。
定理1 中国剩余定理的推论 设 p 1 , p 2 , ⋯ p s p_1,p_2,\cdots p_s p1,p2,⋯ps是 s s s个两两互质的正整数, p = p 1 p 2 ⋯ p s p=p_1p_2\cdots p_s p=p1p2⋯ps,则同余式 f ( x ) ≡ 0 ( m o d p ) f(x)\equiv 0(mod\ p) f(x)≡0(mod p)和同余式方程组 f ( x ) ≡ 0 ( m o d p i ) i ∈ { 1 , 2 , ⋯ , s } f(x)\equiv 0(mod\ p_i)i\in\{1,2,\cdots,s\} f(x)≡0(mod pi)i∈{1,2,⋯,s}等价。
对于RSA加密算法解密过程中的运算 M = C d m o d N M = C^d\ mod\ N M=Cd mod N,由于合法的接收方拥有私钥 ( d , N ) (d,N) (d,N),并且已知模数 N = p q N = pq N=pq,因此根据定理1可将RSA加密算法的解密过程由计算模数 N N N的指数运算转换为计算素数 p p p和 q q q的同余方程组。
M 1 = C d m o d p M 2 = C d m o d q M_1 = C^d\ mod\ p \\ M_2 = C^d\ mod\ q M1=Cd mod pM2=Cd mod q
利用费马小定理以及同余式具有的性质。令 r = d ( m o d p − 1 ) r=d(mod\ p-1) r=d(mod p−1),即, d = k ( p − 1 ) + r d = k(p-1)+r d=k(p−1)+r。
M 1 = C k ( p − 1 ) + r ( m o d p ) = C k ( p − 1 ) C r ( m o d p ) = 1 k C r ( m o d p ) M_1 = C^{k(p-1)+r}\ (mod\ p) =C^{k(p-1)}C^r\ (mod\ p)=1^kC^r(mod\ p) M1=Ck(p−1)+r (mod p)=Ck(p−1)Cr (mod p)=1kCr(mod p)
即, M 1 = C d m o d ( p − 1 ) ( m o d p ) = ( C m o d p ) d m o d ( p − 1 ) ( m o d p ) M_1 = C^{d\ mod\ (p-1)}\ (mod\ p) =(C mod p)^{d\ mod\ (p-1)}(mod\ p) M1=Cd mod (p−1) (mod p)=(Cmodp)d mod (p−1)(mod p)。
同理 M 2 = C d m o d ( q − 1 ) ( m o d q ) = ( C m o d q ) d m o d ( q − 1 ) ( m o d q ) M_2 = C^{d\ mod\ (q-1)}\ (mod\ q) =(C mod q)^{d\ mod\ (q-1)}(mod\ q) M2=Cd mod (q−1) (mod q)=(Cmodq)d mod (q−1)(mod q)。
M 1 = ( C m o d p ) d 1 ( m o d p ) M 2 = ( C m o d q ) d 2 ( m o d q ) M_1 = (C\ mod\ p)^{d_1}(mod\ p) \\ M_2 = (C\ mod\ q)^{d_2}(mod\ q) M1=(C mod p)d1(mod p)M2=(C mod q)d2(mod q)
其中, d 1 = d m o d ( p − 1 ) d_1 = d\ mod\ (p-1) d1=d mod (p−1), d 2 = d m o d ( q − 1 ) d_2 = d\ mod\ (q-1) d2=d mod (q−1)
对于多素数RSA加密算法,在解密过程中利用中国剩余定理对解密方式进行优化加快解密速度。
算法:中国剩余定理简化多素数RSA解密算法
输入:密文消息 C C C
输出:明文消息 M M M
Step 1. 计算 d p 1 , d p 2 , ⋯ d p n d_{p_1},d_{p_2},\cdots d_{p_n} dp1,dp2,⋯dpn
{ d p 1 = d m o d ( p 1 − 1 ) d p 2 = d m o d ( p 2 − 1 ) ⋯ d p n = d m o d ( p n − 1 ) \left\{ \begin{aligned} d_{p_1} &= d \ mod\ (p_1-1) \\ d_{p_2} &= d \ mod\ (p_2-1) \\ &\cdots \\ d_{p_n} &= d \ mod\ (p_n-1) \end{aligned} \right. ⎩ ⎨ ⎧dp1dp2dpn=d mod (p1−1)=d mod (p2−1)⋯=d mod (pn−1)
Step 2.计算 C p 1 , C p 2 , ⋯ C p n C_{p_1},C_{p_2},\cdots C_{p_n} Cp1,Cp2,⋯Cpn
{ C p 1 = C m o d p 1 C p 2 = C m o d p 2 ⋯ C p n = C m o d p n \left\{ \begin{aligned} C_{p_1} &= C \ mod\ p_1 \\ C_{p_2} &= C \ mod\ p_2 \\ &\cdots \\ C_{p_n} &= C \ mod\ p_n \end{aligned} \right. ⎩ ⎨ ⎧Cp1Cp2Cpn=C mod p1=C mod p2⋯=C mod pn
Step 3.计算 M p 1 , M p 2 , ⋯ M p n M_{p_1},M_{p_2},\cdots M_{p_n} Mp1,Mp2,⋯Mpn
{ M p 1 = C p 1 d p 1 m o d p 1 M p 2 = C p 2 d p 2 m o d p 2 ⋯ M p n = C p n d p n m o d p n \left\{ \begin{aligned} M_{p_1} &= C_{p_1}^{d_{p_1}} \ mod\ p_1 \\ M_{p_2} &= C_{p_2}^{d_{p_2}} \ mod\ p_2 \\ &\cdots \\ M_{p_n} &= C_{p_n}^{d_{p_n}} \ mod\ p_n \end{aligned} \right. ⎩ ⎨ ⎧Mp1Mp2Mpn=Cp1dp1 mod p1=Cp2dp2 mod p2⋯=Cpndpn mod pn
Step 4. 计算 M M M
M = ( ( M p 1 M 1 p 1 − 1 ) ( m o d N ) + ⋯ + ( M p n M n p n − 1 ) ( m o d N ) ) ( m o d N ) M =( (M_{p_1}M_1^{p_1-1})(mod\ N)+\cdots +(M_{p_n}M_n^{p_n-1})(mod\ N))(mod\ N) M=((Mp1M1p1−1)(mod N)+⋯+(MpnMnpn−1)(mod N))(mod N)
包含以下文件
传统RSA实现:
1、ZIntMath:大整数的运算库,包括计算乘模运算,幂模运算(蒙哥马利算法),最大公约数算法及扩展最大公约数算法(扩展欧几里得算法)等。
2、ZPrime:质数库,包括 Miller_Rabin素数判断法,大整数快速因式分解算法(pollard_rho算法),生成指定位数的大质数或大整数算法等。
3、ZRSA: RSA算法库,使用上面两个库,实现RSA算法。实现了生成指定数位的密钥对,加密,解密,签名和验证,这5个核心功能。
4、RSAtest.py一个使用RSA算法库的例子。例子从生成密钥对开始,对数据进行加解密,签名和验证签名,最后用修改后的消息再次验证签名。
改进RSA算法实现:
5、IRSA:改进的RSA算法库,实现了基于多素数的指定数位的密钥对,RSA加密,RSA解密,基于中国剩余定理的RSA解密,签名,验签。
6、IRSAtest.py 使用改进RSA算法库的例子。
具体Python代码见多素数及中国剩余定理改进RSA的Python实现
运行结果如下: