1、密钥生成
Bob在本机生成一对密钥,采用RSA、ECC等算法(公钥公开,私钥严格保密)
2、证书申请
公钥 + 身份信息 + 数字签名(此签名用于自证防篡改) ----> 证书签名请求 -----> 权威证书机构
3、身份验证 & 签发
CA 验证线下真实身份,CA用自己的私钥对Bob的(公钥,身份信息,有效期和颁发者信息)签名,生成X.509数字证书( 域名证书.crt + 根证书(root_bundle).crt)
4、证书发布 & 获取
CA将创建好的证书发送给Bob,Bob把证书部署到服务器,在与Alice通信时(如建立HTTPS连接)发送该证书,证书中含有Bob的公钥和身份信息
5、安全通信过程
(1) Alice生成随机的会话密钥,并用Bob的公钥加密会话密钥K → Bob 用私钥解密得到会话密钥K;
(2) Alice通过对称密钥K加密原文,Bob通过对称密钥K解密原文,并通过哈希生成数字摘要1。(此处的原文可能被篡改);
(3) Alice对原文生成数字摘要,并进行私钥数字签名;Bob通过A的公钥解密得到数字摘要2(这里证明摘要确实来自客户A);
(4) 比较数字摘要1和数字摘要2,相等表示原文没有被篡改,而且确实来自客户A。
二、安全通信流程

(真实 RSA 用的质数有几百位,这里只用 3 位,方便手算。)
-
造锁:选质数 p = 3, q = 11 N = p·q = 33 φ(N) = (3−1)(11−1) = 2·10 = 20
-
选公开指数 e 找一个小奇数,且与 20 互质 → 选 e = 3 公钥 = (N, e) = (33, 3)
-
算私钥指数 d d ≡ e⁻¹ (mod φ(N)) → 3·d ≡ 1 (mod 20) 试几下可得 d = 7 (因为 3·7 = 21 ≡ 1 mod 20) 私钥 = (N, d) = (33, 7)
-
加密(上锁) 明文 M = 5 (必须 < N=33) C ≡ M^e (mod N) = 5³ mod 33 5³ = 125 → 125 ÷ 33 = 3 余 26 所以密文 C = 26
-
解密(开锁) M′ ≡ C^d (mod N) = 26⁷ mod 33 用“平方-乘”快速算: 26² mod 33 = 676 mod 33 = 16 26⁴ mod 33 = 16² mod 33 = 256 mod 33 = 25 26⁷ = 26⁴ · 26² · 26¹ mod 33 = 25 · 16 · 26 mod 33 = 400 · 26 mod 33 400 mod 33 = 4 4 · 26 = 104 104 mod 33 = 5
得到 M′ = 5,和原明文 M 完全一致,开锁成功!
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
# ===== 加密 =====
key = get_random_bytes(32) # 256 位密钥
cipher = AES.new(key, AES.MODE_GCM) # cipher 是已经装填好密钥和随机nonce、等待你对明文进行加密+认证的“工具箱”
ct, tag = cipher.encrypt_and_digest(b'hello world') # 加密+认证,ct是密文,tag是标签
print("密钥 key :", key.hex())
print("nonce :", cipher.nonce.hex())
print("密文 ct :", ct.hex())
print("标签 tag :", tag.hex())
# ===== 解密 =====
dec = AES.new(key, AES.MODE_GCM, nonce=cipher.nonce) //用完全相同的key+nonce重新跑CTR生成器
pt = dec.decrypt_and_verify(ct, tag) # 解密+认证
print("解密结果 :", pt.decode()) # 把字节串转成字符串打印
——标识证书的版本(版本1、版本2或是版本3)。
1.2. 序列号(Serial Number)
——标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符。
1.3. 签名(Signature)
——用于签证书的算法标识,由对象标识符加上相关的参数组成,用于说明本证书所用的数字签名算法。例如,SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1杂凑加密。
1.4. 颁发者(Issuer:)
——证书颁发者的可识别名(DN)。
1.5. 有效期(Validity)
——证书有效期的时间段。本字段由”Not Before”和”Not After”两项组成,它们分别由UTC时间或一般的时间表示(在RFC2459中有详细的时间表示规则)。
1.6. 主体(Subject)
——证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名。
1.7. 主体公钥信息(Subject Public Key Info)
——主体的公钥(以及算法标识符)。
1.8. 颁发者唯一标识符(Issuer Unique Identifier)
——标识符—证书颁发者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。
1.9. 主体唯一标识符(Subject Unique Identifier)
浙公网安备 33010602011771号