Public-key Cryptography 简介

Public-key cryptography (公开密钥加密) 又称 asymmetric cryptography (非对称加密),即存在两把不同的密钥,分别称为公钥 Pu 和私钥 Pr,公钥通常用来加密明文 M,只有私钥才能解密密文 C,如果用 E 和 D 分别表示加密和解密算法,那么有:

C = E(Pu, M)
M = D(Pr, C)

下图(摘自维基百科)形象的表述了加密和解密流程:

P1     P2

传统的对称加密需双方共享相同的密钥,通信安全很大程度依赖双方是否能妥善的管理密钥。公开密钥加密发明是密码学最为重要的里程碑之一,它从数学的角度保证了通信安全。公开密钥加密体系有三大范畴:

  • Encryption/Decryption:即加密与解密,发送方用接收方的公钥加密消息
  • Digital Signature:数字签名,发送方用私钥加密消息摘要生成签名,保证消息的完整性和可靠性
  • Key Exchange:安全的交换密钥,通常用于交换对称加密的密钥

公钥加密有多种算法,最有名的的是 RSADH 等,如下:

+----------------+-----------------------+-------------------+--------------+
|   Algorithm    | Encryption/Decryption | Digital Signature | Key Exchange |
+----------------+-----------------------+-------------------+--------------+
|      RSA       |          Yes          |        Yes        |      Yes     |
+----------------+-----------------------+-------------------+--------------+
| Deffie-Hellman |          No           |        No         |      Yes     |
+----------------+-----------------------+-------------------+--------------+
| Elliptic Curve |          Yes          |        Yes        |      Yes     |
+----------------+-----------------------+-------------------+--------------+
|      DSS       |          No           |        Yes        |      No      |
+----------------+-----------------------+-------------------+--------------+

数论知识

理解 RSA 算法前,先介绍一些必要的数论领域知识。

欧拉函数

对正整数 n,欧拉函数 指小于 n 且与 n 互质的正整数数目,通常用 φ(n) 表示。

对于素数 p,有:   
φ(p) = p - 1   
对于素数 p, q 有:   
φ(p * q) = φ(p) * φ(q) = (p - 1) * (q - 1)   
如 φ(21) = 2 * 6 = 12

欧拉定理

对于正整数 a 和 n,欧拉定理有:

a^φ(n) mod n = 1
即:a^(φ(n) + 1) mod n = a mod n

模反元素

当 a, n 互质,一定存在模仿元素 b,使得:

a * b mod n = 1
由欧拉定理可知:
1 = a^φ(n) mod n = a * a^(φ(n) - 1) mod n
可求得一个 b = a^(φ(n) - 1),满足 a * b mod n = 1

RSA 算法原理

RSA 简介

RSA 算法于 1977 由 Ron Rivest,Adi Shamir 和 Leonard Adleman 提出,是目前应用最为广泛的非对称加密算法。极大数分解难题是 RSA 算法可靠性的根基,即给定两个大素数 p 和 q,其中 n = p * q,有:

已知 p、q,求 n = p * q 很容易    
已知 n,求 p、q,并且 p * q = n 很困难

RSA 原理

对于明文 M 和 密文 C,且 M < n, C < n,其加密和解密过程如下:

C = M^e mod n
M = C^d mod n

上述公式可表述为:
M = M^(e * d) mod n

根据欧拉定理可知:
只需 e * d mod φ(n) = 1,即可满足上式

如果我们选取素数 p, q,那么:
n = p * q 容易计算
φ(n) = (p - 1) * (q - 1) 容易计算
很容易选取一个正整数 e,e 和 φ(n) 互质

当 e 和 φ(n) 互质时:
由欧拉定理可很容易算出一个模反元素 d,满足 e * d mod φ(n) = 1

RSA 流程

Cryptography and Network Security 形象的描述了 RSA 流程:

+-------------------------------------------------------------------------------+
|                                 Key Generation                                |
|                                                                               |
|     Select p, q                               p and q both prime, p != q      |
|     Calculate n = p * q                                                       |
|     Calculate φ(n) = (p - 1) * (q - 1)                                        |
|     Select integer e                          e is relatively primte to φ(n)  |
|     Calculate d                               (d * e) mod n = 1               |
|     Public key                                PU = {e, n}                     |
|     Private key                               PR = {d, n}                     |
+-------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------+
|                                  Encryption                                   |
|                                                                               |
|     Plaintext M                               M < n                           |
|     Ciphertext C                              C = M^e mod n                   |
+-------------------------------------------------------------------------------+
+-------------------------------------------------------------------------------+
|                                  Decryption                                   |
|                                                                               |
|     Ciphertext C                              C                               |
|     Plaintext M                               M = C^d mod n                   |
+-------------------------------------------------------------------------------+