TL;DR: 上一篇文章我们介绍了对称加密算法,其最主要的特点就是加密者和解密者持有相同的密钥,所以称之为对称
。照理推想,有对称就有非对称。这篇文章我们来介绍另外一个重要的加密算法:非对称加密算法 (Asymmetric Cryptography), 也称为公开密钥加密算法 (Public Key Cryptography).
公开密钥算法概要
首先,跟对称密钥算法一样,非对称密钥算法不是指一个算法,而是一种算法。这类算法与对称加密算法相比较,有如下的特点:
-
密钥是一对
在上文的对称加密算法我们看到,密钥是一串数字或者字符串,加密者和解密者使用相同的密钥进行加解密。公开密钥算法则不同,它的密钥是一对的,分成公钥 - public key 和私钥 - private key。一般私钥是由密钥对的生成者持有,比如服务器端,不能泄露。而公钥是任何人都可以持有,是公开发布的,不怕泄露。由此这个算法而得到
公开密钥
算法的名号。 -
功能不一样
对称加密算法的主要功能是加密和解密,而公开密钥算法的功能除了加密和解密,还可用于密钥协商,数字签名,是数字证书, HTTPS等的最核心基础。
-
运行速度慢
相对于对称加密算法,公开密钥算法由于其基础运算是指数运算再求余,而为了安全,指数一般是一个比较大的数值,所以其运算非常缓慢,而且由于算法的局限,一次加密的明文块很小,所以如果要加密一个很大的明文,比如一个文件的话,那性能是惨不忍睹的。所以一般情况下,会根据使用场景,只用公开密钥算法来加密对密钥保存要求更高的数据,而不是全部都用公开密钥算法来加密。
RSA 算法
现在我们来介绍第一个公开密钥算法,也是比较常用而且重要的一个算法,叫RSA。 该算法是由Ron Rivest, Adi Shamir, Leenard Aldeman三个人创建的,以他们三个人的首字母来命名RSA。
RSA算法原理
RSA算法的设计用到的数学知识很多,RSA会用到质数,互质数,公约数定理,欧几里得算法,同余和模求解,唯一质数分解定理,欧拉函数,欧拉定理和费马定理等。受限于时间和数学能力,这里就不一一展开了,有兴趣的可以参考这篇文章 https://www.jianshu.com/p/6aa7b59be872
公私钥的生成
-
生成两个不相等的大质数p和q,它们的积 n = p q n = pq n=pq ,这个n的二进制位数就是密钥的位数,通常是1024, 2048, 4096.
-
计算p和q的乘积 n = p q n=pq n=pq , 以及欧拉公式 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n)= (p-1)(q-1) φ(n)=(p−1)(q−1)
-
选择一个整数e, 使得 1 < e < φ ( n ) 1 < e< \varphi(n) 1<e<φ(n), 且e和 φ ( n ) \varphi(n) φ(n) 是互质的, 即 g c d ( e , φ ( n ) ) = 1 gcd(e, \varphi(n))=1 gcd(e,φ(n))=1. 在大多数RSA算法实现里面,e固定位65537
-
计算 e 对于 φ ( n ) \varphi(n) φ(