前言
有了上面的数论基础之后,我们就可以来看 RSA 算法的神奇之处了。
算法描述
我们先把整个加解密过程简单流程描述一下。加解密过程如下:
加密:C=Me mod nC = M^e\,mod\,nC=Memodn
解密:M=Cd mod n=(Me)d mod n=Med mod nM = C^d\,mod\,n = (M^e)^d\,mod\,n=M^{ed}\,mod\,nM=Cdmodn=(Me)dmodn=Medmodn
其中,M 表示待加密的明文,C 表示加密后的密文,e,n,d 均为整数,如果能找到合适的这三个数能让上面的过程满足,就可以把PU = {e,n}当作公钥,PR = {d,n}当作私钥,进行公钥密码体制的加解密了。
计算方法
问题转化
问题:寻找 e,d,n 使所有 M<nM < nM<n, 能使 Med mod n=MM^{ed}\,mod\,n=MMedmodn=M, 成立。
解:
- 先选定两个素数,p,qp, qp,q。
- 计算 n=pqn = pqn=pq
- 选定 e,使 e,ϕ(n)e, \phi(n)e,ϕ(n) 互素,这个一般会选 3, 7, 65537 等素数,也可以随机选择
- 可以计算得到 d, 使 ed≡ 1 mod ϕ(n)ed\equiv\,1\,mod\,\phi(n)ed≡1modϕ(n), 这个可以通过扩展欧几里德算法得到
这样 就得到了 e,de,de,d,那么选择出来的 e,d,p,q,ne,d,p,q,ne,d,p,q,n 能使上式成立么?
证明
令 ϕ(n)=k\phi(n) = kϕ(n)=k,
因为 ed≡1 mod ϕ(n)ed \equiv 1\,mod\,\phi(n)ed≡1modϕ(n), 即 ed mod ϕ(n)=1ed\,mod\,\phi(n)=1edmodϕ(n)=1
所以 ed=tk+1ed = tk + 1ed=tk+1。
则:
Med mod n=Mtk+1 mod n=(M∗Mtk)mod nM^{ed}\,mod\,n = M^{tk+1}\,mod\,n=(M*M^{tk})mod\,nMedmodn=Mtk+1modn=(M∗Mtk)modn
Med mod n=[(M mod n)∗(Mtk mod n)]mod nM^{ed}\,mod\,n = [(M\,mod\,n)*(M^{tk}\,mod\,n)]mod\,nMedmodn=[(Mmodn)∗(Mtkmodn)]modn
Med mod n=[(M mod n)∗((Mkmod n)tmod n)]mod nM^{ed}\,mod\,n = [(M\,mod\,n)*((M^kmod\,n)^tmod\,n)]mod\,nMedmodn=[(Mmodn)∗((Mkmodn)tmodn)]modn
因为 Mk mod n=Mϕ(n)mod nM^k\,mod\,n = M^{\phi(n)}mod\,nMkmodn=Mϕ(n)modn, 根据欧拉定理,当 M 和n 互素时,Mϕ(n)mod n=1M^{\phi(n)}mod\,n=1Mϕ(n)modn=1,
所以 Mkmod n=1M^kmod\,n=1Mkmodn=1。
Med mod n=[(M mod n)∗(1tmod n)]mod nM^{ed}\,mod\,n = [(M\,mod\,n)*(1^tmod\,n)]mod\,nMedmodn=[(Mmodn)∗(1tmodn)]modn
Med mod n=M mod nM^{ed}\,mod\,n=M\,mod\,nMedmodn=Mmodn
因为 M<nM < nM<n, 所以 M mod n=MM\,mod\,n = MMmodn=M
即 Med mod n=MM^{ed}\,mod\,n=MMedmodn=M。
证明完毕,说明此时 e,d,n 满足 RSA 算法要求,就可以使用公钥PU={e,n}和私钥PR={d,n}了。
场景描述
假设通信双方是 Alice 和 Bob, Bob 想给 Alice 发消息如 88,场景是怎样的呢。
- Alice 选取两个素数 p,q,比如 17,11
- Alice 计算 n=pq=17∗11=187n = pq = 17*11= 187n=pq=17∗11=187
- Alice 计算 ϕ(n)=(p−1)∗(q−1)=16∗10=160\phi(n) = (p-1)*(q-1)=16*10=160ϕ(n)=(p−1)∗(q−1)=16∗10=160
- Alice 选择一个小于ϕ(n)\phi(n)ϕ(n)且与它互素的数,如 e=7e=7e=7
- 通过计算得到 d, 使 de≡ 1(mod 160)de\equiv\,1(mod\, 160)de≡1(mod160), 因为 23∗7=161=1∗160+123*7=161=1*160+123∗7=161=1∗160+1, 所以 d=23d=23d=23
- Alice 把 {7,187} 发给 Bob, 自己保存 {23,187}
- Bob 计算 C=Me mod nC = M^e\,mod\,nC=Memodn, 即 887 mod 187=1188^7\,mod\,187=11887mod187=11, 把 11 发给 Alice
- Alice 计算 M=Cd mod nM = C^d\,mod\,nM=Cdmodn, 即 1123 mod 187=8811^{23}\,mod\,187=881123mod187=88,得到原文。
安全性
攻击者拿到 e,n 要想算出 d, 即用公式 ed≡ 1 mod ϕ(n)ed\equiv\,1\,mod\,\phi(n)ed≡1modϕ(n), 此时如果知道 ϕ(n)\phi(n)ϕ(n)即能用扩展欧几里德算法得到 d,并且如果知道 p,q 那么是可以通过ϕ(n)=ϕ(pq)=ϕ(p)∗ϕ(q)=(p−1)∗(q−1)\phi(n)=\phi(pq)=\phi(p)*\phi(q)=(p-1)*(q-1)ϕ(n)=ϕ(pq)=ϕ(p)∗ϕ(q)=(p−1)∗(q−1)计算得来的,但是从 n 分解出两个质因数除了暴力破解没有更加有效的算法,如果 n 选择较大的话,破解时间将以年计,所以我们认为该算法是安全的。目前要求较高的密钥选择在 107510^{75}1075以上,对应的密钥长度可以达到 1024 位。
本文介绍了RSA公钥加密算法的基本原理及其实现步骤。包括选择素数、计算欧拉函数、确定公钥私钥等内容,并通过实例演示了加密解密的过程。

8万+

被折叠的 条评论
为什么被折叠?



