前言
本来以前就想学习一下非对称加密算法中,大名鼎鼎的 RSA 算法,但是奈何本人当时不会数论,完全看不懂那些讲解。并且那些讲解往往都没有说清楚每一步在干什么,所以自然也没能理解 RSA 算法。
近日看了一个关于 RSA 算法的讲解视频,茅塞顿开,明白了 RSA 算法的基本原理。在这里就来记录一下自己对 RSA 算法的理解。
注意
这篇文章
并不通俗易懂,文章中含有大量数论相关内容。建议在阅读前先了解
同余 和
欧拉定理。
公钥和私钥
公钥和私钥都由一对数字组成,这里可以假定公钥为 (N,e),私钥为 (N,d)。其中两个 N 是相等的。
使用公钥加密的内容可以用私钥解密,使用私钥加密的内容可以用公钥解密。不过由于公钥是公开的,因此私钥加密一般用于数字签名。公钥和私钥这一对密钥实际上没有什么本质的区别。区别仅在于一个是公开的,一个是不公开的。
加密和解密
加密
假设有明文 x,使用公钥对数据进行加密的过程,相当于将明文 x 幂上 e 并取除以 N 的余数。这里加密所得的密文 c 满足:
c=xemodN
解密
解密的过程实际上与加密是一样的,只不过使用的是私钥。使用私钥对数据进行解密的过程,相当于将密文 c 幂上 d 并取除以 N 的余数。这里解密出的明文 x′ 满足:
x′=cdmodN=xedmodN=x
这里可以发现密钥对是满足 xedmodN=x 的,因此重点是需要找到一组数字 N,e,d 满足上述情况。
样例
例如有这么一对密钥,公钥为 (33,3),私钥为 (33,7)。
- 加密时,假设有明文 x=25 需要加密,那么就将数据幂上公钥中的 3,得到密文 c=x3mod33=16。
- 解密时,就将密文幂上私钥中的 7,得到明文 x′=c7mod33=25。
生成密钥对
生成一对密钥首先需要两个质数 p,q,将这两个质数相乘即得到了 N。
这里还需要求出 φ(N) 的值,这里设为 T,根据欧拉函数的积性特征可得:
T=φ(p)⋅φ(q)=(p−1)⋅(q−1)
而此时就可以开始计算公钥和私钥了,公钥 e 和私钥 d 满足:
ed≡1(modT)
这里需要先选择出这个密钥对中的其中一个密钥 e,这里可以随便选,但选择出的密钥需要与 T 互质,并且 1<e<T,这样才能保证能找到另一个密钥 d。当选出密钥 e 之后就可以很容易地计算出另一个密钥 d 了。
最后将 N,e 封装成公钥,N,d 封装成私钥,然后销毁掉 p,q,T 这三个数字。
如果 p,q 取得足够大,那么其乘积 N 也会变得非常大。想要找到一个大数的两个质因数十分困难,因此保证了 RSA 算法的安全性。
欧拉定理
互质情况
解密时:
xed=xkφ(N)+1=x(xφ(N))k
根据欧拉定理,若 x 与 N 互质,则:
xφ(N)≡1(modN)
可得:
xed≡x(1)k≡x(modN)
不互质情况
若 x 与 N 不互质,不妨设 x=ap,ed−1=b(q−1),则可得:
xed=aped≡0≡ap≡x(modp)
xed=x(xed−1)=x(xb(q−1))=x(xq−1)b=x(xφ(q))b≡x(1)b≡x(modq)
整理后即是:
xed≡x(modp)
xed≡x(modq)
因此可以证明得到 xed≡x(modN)。
样例
- 先选择两个质数 p=11,q=17。
- 可以计算得到 N=pq=187,T=(p−1)(q−1)=160。
- 随便选出一个公钥 e=19,计算可得私钥 d=59。
- 假设有数据 x=114 需要进行加密,那么 c=x19mod187=113。
- 解密时 x′=c59mod187=114。
参考资料