RSA密码体制
引言:
RSA加密的本意并不是为了取代对称密码,而且它比诸如AES的密码要慢很多,因为RSA当中涉及许多数学计算,RSA通常和类似AES的对称密码一起使用,真正用来加密大量数据的是对称密码。而RSA主要保护对称密码的密钥。
数学困难问题:RSA基于大整数分解难题
加密解密
RSA的加密和解密都是在整数环 Z n Z_n Zn内完成的。假设RSA加密明文 x x x,而表示 x x x的位字符串则是 Z n = { 0 , 1 , . . . , n − 1 } Z_n=\{0,1,...,n-1\} Zn={0,1,...,n−1}内的元素,所以明文 x x x表示的二进制必然小于 n n n。
x , y , n , d x,y,n,d x,y,n,d都是非常长的数字,通常为1024位或更长。值 e e e有时称为加密指数或公开指数,私钥 d d d有时称为解密指数或保密指数。如果Alice想将一个加密后的消息传送给Bob,她需要拥有Bob的公钥 ( n , e ) (n,e) (n,e),而Bob将用他自己的私钥 d d d进行解密。
密钥生成与正确性检验
注:我们限定了 g c d ( e , p h i n ) = 1 gcd(e,phi_n)=1 gcd(e,phin)=1那么私钥 d d d,一定存在
这里我们可以借助扩展欧几里得算法求解私钥
d
d
d
g
c
d
(
p
h
i
n
,
e
)
=
1
=
s
∗
p
h
i
n
+
t
∗
e
gcd(phi_n,e)=1=s*phi_n+t*e
gcd(phin,e)=1=s∗phin+t∗e
此时,我们的参数
t
t
t就是我们求解的私钥
d
d
d.
d = t m o d ( p h i n ) d=t\ mod\ (phi_n) d=t mod (phin)
正确性证明:
快速指数运算
int qpow(int a, int n){
int ans = 1;
while(n){
if(n&1) //如果n的当前末位为1
ans *= a; //ans乘上当前的a
a *= a; //a自乘
n >>= 1; //n往右移一位
}
return ans;
}
借助CRT加速加解密
对于任意的
(
m
1
,
m
2
)
(m_1,m_2)
(m1,m2)必然存在一个唯一的
m
m
m,使得
m
1
=
m
m
o
d
(
p
)
m
2
=
m
m
o
d
(
q
)
m_1=m\ mod\ (p) \\ m_2=m\ mod\ (q)
m1=m mod (p)m2=m mod (q)
此时,可以把求解
c
d
m
o
d
n
c^d\ mod\ n
cd mod n的计算,转换成求解这个方程组。但是此时的
d
d
d还是比较大,计算比较困难。
d = k ∗ ( p − 1 ) + r d=k*(p-1)+r d=k∗(p−1)+r,则 c d m o d p = c r ∗ c k ∗ ( p − 1 ) m o d p = c r m o d p c^d\ mod\ p=c^r*c^{k*(p-1)}\ mod\ p=c^r \mod p cd mod p=cr∗ck∗(p−1) mod p=crmodp
其中 r = d m o d ( p − 1 ) r=d\ mod\ (p-1) r=d mod (p−1),因此, ( c d m o d p ) (c^d \mod\ p) (cdmod p)可以降解为 c ( d m o d p − 1 ) m o d p c^{(d\ mod\ p-1)}\ mod\ p c(d mod p−1) mod p
( c d m o d q ) (c^d \mod\ q) (cdmod q)可以降解为 c ( d m o d q − 1 ) m o d q c^{(d\ mod\ q-1)}\ mod\ q c(d mod q−1) mod q
素数检测
费马定理对于所有的素数成立如果 p p p时一个素数,那么对于任意的 a a a,都有 a p − 1 = 1 m o d p a^{p-1}=1\ mod\ p ap−1=1 mod p
如果,运算时 a p − 1 m o d p ≠ 1 a^{p-1}\ mod\ p \neq 1 ap−1 mod p=1,那么可以直接判断 p p p是合数直接退出。
如果,满足 a p − 1 = 1 m o d p a^{p-1}=1\ mod\ p ap−1=1 mod p还需要不断变化 a a a,多次检验