1、概述
在第三篇:计算机对称加密里,我已经整理了非对称加密的概念。而且也介绍了“模运算”。这里就对非对称加密里典型的加密法----RSA加密法进行整理。
2、RSA加密法
RSA是第一个比较完善的公开秘钥算法。RSA以它的三个发明者Ron Rivest、Adi Shamir、Leonard Adleman的名字组成,目前它已经成为流行的公开秘钥算法。
2.1、RSA加密原理
1、选择一对不同的、足够大的质数P,Q
2、计算 N = P * Q;
3、计算 M = (P-1) * (Q-1),同时对P 和 Q进行保密;
4、找一个数 E,这个数与 M 是互质数,且满足1 < E < M
5、计算D,使得 D*E = 1(mod M)
6、形成公钥KU = (E,N),私钥KR=(D,N)
7、加密时,先将明文变换成 0 至 N-1 的一个整数 O。若明文较长,则分组计算。密文 C =
O
E
O^E
OE(mod N)
8、解密时,原文S =
C
D
C^D
CD(mod N)
为什么使用两个足够大的指数P和Q?而且加密和解密使用的N、E、D为什么是通过P和Q算出来的?这是由数学家经过严格的数学证明得到的,保证了正确性。通过上面的介绍你也能看出来,非对称性加密的关键是对P和Q的保护。
在使用时,生成公钥和私钥的一方,可以公开自己的公钥,如果别人想给发送消息,就使用公钥对信息进行加密。如果我想发送给别人东西,可以使用私钥对信息进行加密,这样别人虽然破解不了密文,但是公钥是公开的,别人可以使用公钥进行解密。
原理太枯燥,而且不好理解,下面就举例说明。
2.2、实例描述
假设爱丽丝需要将明文“key”通过RSA加密后传递给鲍勃,则过程如下:
1、设计公私秘钥(E,N)和(D,N)
令P = 3,Q = 11,得出 N = 3 * 11 = 33,M = 2 * 10 = 20;取 E = 3(3与20互质),则 E * D = 1 (mod M),即 3 * D = 1 (mod 20)。
D怎样取值?可以用试算的办法来寻找。试算结果见下表:
通过试算我们找到,当 D = 7 时,E*D = 1 (mod N) 等式成立。因此,可令D = 7。从而我们设计出一堆公私秘钥为:公钥 KU = (E,N) = (3,33),私钥 KR = (D,N) = (7,33)
2、原文数字化
将明文信息数字化。假定明文英文字母编码表字母顺讯排列数值,即:
则得到分组后的key的明文信息为:11,05, 25。
3、明文加密
使用公钥(3,33)将数字化明文分组信息加密成密文。根据公式 C =
O
E
O^E
OE(mod N)计算的密文为:
11 26 16
这里也可以用私钥进行加密,如果用私钥进行加密,解密时需要使用公钥。
4、密文解密
得到密文之后,因为信息时使用公钥加密,则解密必须使用私钥进行解密。这里使用私钥(7,33)对密文进行解密。根据公式 S =
C
D
C^D
CD(mod N) 计算的原文为:
11 05 25
当然这里只是一个简单的应用,实际的运用可能比这里复杂的多,由于RSA算法的公钥私钥的长度要到1024位甚至2048位才能保证安全。因此,P、Q、E的选取、公私钥的生成,加解密时指数和模运算,都需要仰仗计算机的完成。
2.3、数字签名
在现实通信中,使用RSA对原文进行了加密,保证了信息的安全,但是怎么判断是不是正确的人给我发送的信息,而不是别人伪造的呢?
这里就是咱上面提到的,使用发送方使用私钥进行加密,接收方去查找发送发的公钥,然后使用这个公钥对密文进行解密,如果能够成功解密,则确定是正确的人发送的信息。
有时我们不想让所有人都能对数字签名进行解密,那么怎么办呢?
比如爱丽丝想发信息给鲍勃,爱丽丝使用自己的秘钥把原文进行加密,然后在使用鲍勃的公钥把密文在加一次密。这样信息就保证只能鲍勃进行解密,而且还能确认爱丽丝的身份。
这样当非对称钥匙+数字签名,RSA加密就非常实用了。
3、总结
虽然说RSA加密非常安全,但是加密过程复杂,其中包含了大量的大数据计算,效率低。所以RSA一般只加密一些短小的信息。
但是随着互联网的发展,需要加密的数据越来越大,使用RSA加密严重影响了效率。比如一份机密邮件,内容使用RSA加密,电脑CPU全力工作,可能需要几分钟才能完成加密。
所以一般采用: 信息主体仍然采用对称加密的方式,在传递钥匙的过程中,对钥匙使用RSA进行加密。这样就绕过了RSA效率的问题。
感谢大家,我是假装很努力的YoungYangD(小羊)。
参考资料:
《卓克的密码学课》
https://www.cnblogs.com/jiftle/p/7903762.html