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