RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
下面我就来根据我所在网上看的资料 自己整理一下整个加密解密的过程
首先 假设甲方要向乙方发送消息 那么甲方需要对消息加密 乙方需要对消息解密
加密算法分为对称性和非对称性2种算法 根据加密解密所使用的秘钥相不相同来区分, 我们要讨论的RSA算法就是非对称性的 也就是加密的公钥和解密的私钥是不同的
由于公钥是公开的 可以给别人看到所以不需要保护,只需要保护好私钥不被窃取即可,通常私钥的窃取都是在传输的过程中进行的,所以只要防止私钥的传输就好了。
因此甲方发送消息给乙方,所以乙方产生公钥和私钥,之后将公钥公开,用于甲方对消息加密,然后乙方自己拥有私钥,只需要使用私钥解密即可。
那么乙方是如何产生公钥和私钥的呢??
1.由乙方随机选择两个质数 p、q(p!=q) 这里先假设为p = 61和q = 53
2.由p和q计算n n = p * q = 61*53 = 3233
n的二进制长度就为秘钥的长度 RSA算法的秘钥越长越安全,通常采用1024位 重要的时候用2048位
3.计算欧拉函数 也就是求 比n小的和n互质的数的个数 这里表示为f(n)
f(n) = f(p*q) = f(p)*f(q)
由于p和q为质数
所以 f(n) = (p-1)*(q-1)
所以 f(3233) = 60*52 = 3120
4. 随机选择一个数e 使得1<e<f(n) 并且e与f(n)互质 通常如果可以e选 65537
此处e选择 17
5.计算e相对于f(n)的模反元素d 公式如下:
ed = 1(mod f(n)) //此公式表示 ed%f(n) = 1 ..
所以 ed - 1 = k*f(n) =》 ed +(-k)*f(n) = 1 //此方程可用扩展欧几里得算法解答。。
进而求出 d和 k
此处 d求得为 2753 所以 公钥即为(n,e) 私钥为(n,d)
(3233,17) (3233,2753)
以上乙方就求得了 公钥和私钥
之后甲方通过公钥加密 :
假设 消息为m 用公钥(n,e) 对 m加密的过程如下(c为加密后的密文):
m^e = c (mod n ) 即 65^17 = c( mod 3233) 求得 c = 2790
然后乙方通过秘钥对其解密 :
c^d = m (mod n) 即 2790^2753 = m( mod 3233) 求得 m = 65
至此 RSA 算法的加密解密过程就完成了 其中加密解密过程的运算和 扩展欧几里得算法还有待研究 。