RSA加密简介
最近在做SICP练习时又复习了一遍RSA加密,趁这个机会对该算法进行小结。
参考资料:
https://mitpress.mit.edu/sites/default/files/sicp/psets/ps3/readme.html
RSA加密系统简介
RSA加密系统由如下元素构成:
- 公钥;
- 私钥;
- 签名;
发件人$A$使用收件人$B$的公钥$b_{\text{pub}}$对未加密信息$c_0$进行加密,得到加密信息$c_1$;收件人$B$收到加密信息$c_1$后使用自己$b_{\text{pri}}$的私钥进行解码,得到未加密信息$c_0$。
这里有一个问题,收件人B如何判断信息确实来自$A$?RSA加密系统中使用的方法是:
- 发件人$A$对加密信息$c_1$作用一个哈希函数$f$得到一个较小的数字$f(c_1)=d_0$(称为未加密签名),然后发件人$A$使用自己的私钥$a_{\text{pri}}$对$d_0$进行加密得到$d_1$(称为加密签名),发件人$A$发送的时候同时发送加密信息$c_1$以及加密签名$d_1$。
- 收件人$B$收到加密信息$c_1$以及加密签名$d_1$后,使用自己的私钥$b_{\text{pri}}$解码$c_1$得到$c_0$,同时利用$A$的公钥$a_{\text{pub}}$解码加密签名$d_1$得到$d_0$,然后判断$f(c_1)$是否等于$d_0$,如果两者相等,则说明确实接收来自于$A$的信息。
完整的流程图:
说明:
- 私钥是不公开的,公钥是公开的;
- 通过公钥(在多项式时间内)无法得到私钥;
数学原理
在RSA系统中,有两个大质数$p, q$,定义
接着选择数字$e$,使得
最后找到$d$,满足
说明:使用辗转相除法即可求出$d$和$e$。
公钥为序对
私钥为序对
加密流程
对于编码后的信息$s$,公钥加密的信息为
假设收到$S$,利用对应的私钥,解码方式为
注意由于$p,q$是大质数,所以$n=pq$也是一个非常大的数,从而一般情形下可以得到
同样的,我们可以使用私钥加密:
此时利用公钥解密:
安全性
由于公钥$(n, e)$是公开的,假设我们可以得到分解
那么可以计算出
通过辗转相除法即可求得
从而得到私钥$(n,d)$。
所以问题转化为得到分解
的时间复杂度。
根据维基百科,对于一个$k$位的整数,目前没有找到多项式时间复杂度的算法进行整数分解,这说明目前阶段RSA加密系统依然是安全的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere