一、申请获取使用PKI证书流程:

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。

 

二、安全通信流程

image

 

三、非对称加密算法 RSA

用“玩具级”小数字走一遍,你就能一眼看懂为什么“上锁再开锁”能还原原文。 (真实 RSA 用的质数有几百位,这里只用 3 位,方便手算。)


  1. 造锁:选质数 p = 3, q = 11 N = p·q = 33 φ(N) = (3−1)(11−1) = 2·10 = 20

  2. 选公开指数 e 找一个小奇数,且与 20 互质 → 选 e = 3 公钥 = (N, e) = (33, 3)

  3. 算私钥指数 d d ≡ e⁻¹ (mod φ(N)) → 3·d ≡ 1 (mod 20) 试几下可得 d = 7 (因为 3·7 = 21 ≡ 1 mod 20) 私钥 = (N, d) = (33, 7)


  1. 加密(上锁) 明文 M = 5 (必须 < N=33) C ≡ M^e (mod N) = 5³ mod 33 5³ = 125 → 125 ÷ 33 = 3 余 26 所以密文 C = 26


  1. 解密(开锁) 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 完全一致,开锁成功!


“指数 e 把 5 变成 26,指数 d 把 26 变回 5”——之所以可行,就是因为 e·d ≡ 1 (mod φ(N)),欧拉定理保证了幂运算的互逆性。

 

四、对称加密算法 AES

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())         # 把字节串转成字符串打印

 

五、PKI证书格式(X.509证书)

1.1. 版本号(Version)

——标识证书的版本(版本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)

——证书拥有者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。

 

公钥管理 — 证书和PKI - Mysticbinary - 博客园

X.509数字证书的结构与解析 - 骑牛射雕 - 博客园

SM2 加解密 | GMObjC

posted on 2026-01-13 14:22  轩~邈  阅读(4)  评论(0)    收藏  举报