计算机密码学与算法工具(Cryptography & Algorithm Tools)

密码学是信息安全的基石,涵盖机密性、完整性、认证和不可否认性四大安全目标。本文档以 UML 行为图→结构图的递进方式梳理计算机密码学体系,包含对称/非对称加密、哈希、数字签名、TLS 协议、后量子密码等核心领域。


1. 系统概览 — 用例图(Use Case Diagram)

用例图从整体视角展示密码学系统对外提供的安全服务及其参与者(Actor):普通用户、系统管理员、攻击者、外部服务。

PlantUML diagram
图 1-1:密码学系统用例图(Use Case Diagram)
对称加密(Symmetric Encryption)
加密和解密使用同一密钥的算法,速度快,适合大数据量加密。代表:AES、SM4、ChaCha20。
非对称加密(Asymmetric Encryption)
使用公钥加密、私钥解密的算法,适合密钥交换和数字签名。代表:RSA、ECDH、SM2。
数字签名(Digital Signature)
用私钥生成签名、公钥验证,保证消息完整性和发送者身份。代表:Ed25519、ECDSA。

2. 对称加密流程 — 活动图(Activity Diagram)

活动图展示现代 AEAD(认证加密)模式下的加密/解密核心流程,重点显示 AES-GCM 的 CTR 加密 + GHASH 认证两路并行机制。

PlantUML diagram
图 2-1:AEAD 认证加密活动图(Activity Diagram)
AEAD(Authenticated Encryption with Associated Data)
加密的同时提供完整性认证,单趟完成加密+MAC。推荐模式:AES-GCM、ChaCha20-Poly1305。
失败关闭(Fail Closed)
安全设计原则:认证失败时拒绝输出任何数据,不泄露信息给攻击者。对比"失败开放 Fail Open"是危险的反模式。
Demo:OpenSSL 命令行 AEAD 加密
# AES-256-GCM 加密
echo "sensitive data" | openssl enc -aes-256-gcm -K $(xxd -p -c64 key.bin) -iv $(xxd -p -c12 iv.bin) -out cipher.bin

# ChaCha20-Poly1305 加密
openssl enc -chacha20-poly1305 -K $(xxd -p -c32 key.bin) -iv $(xxd -p -c12 iv.bin) -in plain.txt -out cipher.bin

3. TLS 1.3 握手 — 时序图(Sequence Diagram)

时序图完整展示 TLS 1.3 的 1-RTT 握手机制:ClientHello 即带 DH 密钥共享参数,服务端回应后双方即可开始加密通信。

PlantUML diagram
图 3-1:TLS 1.3 全握手时序图(Sequence Diagram)
1-RTT(One Round Trip Time)
TLS 1.3 的核心优化,ClientHello 直接携带 DH 参数,减少一次往返。TLS 1.2 需要 2-RTT。
前向安全(PFS, Perfect Forward Secrecy)
长期密钥泄露不会暴露历史会话密钥。TLS 1.3 强制使用临时 DH 密钥交换,强制 PFS。
HKDF(HMAC-based Key Derivation Function)
基于 HMAC 的密钥派生函数(RFC 5869),将共享密钥派生为多把会话密钥(加密密钥、MAC 密钥、IV)。
Demo:OpenSSL 测试 TLS 1.3 连接
# 连接并显示握手详情
openssl s_client -connect example.com:443 -tls1_3 -msg -keylogfile keys.txt

# 查看证书链
openssl s_client -connect example.com:443 -tls1_3 -showcerts 2>&1 | openssl x509 -text -noout

# cipher 优先级
openssl ciphers -v -tls1_3 | column -t

4. 密钥生命周期管理 — 状态机图(State Machine Diagram)

状态机图展示密码学密钥从生成到销毁的完整生命周期,覆盖 NIST SP 800-57 标准定义的密钥状态变迁。

PlantUML diagram
图 4-1:密钥生命周期状态机图(State Machine Diagram)
CSPRNG(Cryptographically Secure Pseudo-Random Number Generator)
密码学安全的伪随机数生成器。Golang crypto/rand、Linux /dev/urandom、getrandom()。
HSM(Hardware Security Module)
硬件安全模块,密钥在安全芯片内部生成和使用,永不离开硬件。代表:YubiKey、AWS CloudHSM。
Demo:使用 libsodium 生成和销毁密钥
#include <sodium.h>
// 生成 X25519 密钥对
unsigned char pk[crypto_kx_PUBLICKEYBYTES];
unsigned char sk[crypto_kx_SECRETKEYBYTES];
crypto_kx_keypair(pk, sk);

// 使用密钥...

// 安全擦除(sodium 提供 sodium_memzero)
sodium_memzero(sk, sizeof sk);

5. 密码学系统组件架构 — 组件图(Component Diagram)

组件图从软件架构视角展示密码学系统的模块分层:应用层、协议层、密码原语层、硬件抽象层,以及各组件之间的依赖关系。

PlantUML diagram
图 5-1:密码学系统组件图(Component Diagram)
Noise Protocol Framework
模块化安全通道协议框架,WireGuard、WhatsApp 底层使用。握手模式以 NN/KN/KK/XX 等字母组合命名。
Double Ratchet(双棘轮)
Signal 协议核心机制,DH 棘轮保证前向安全,对称棘轮保证消息独立密钥,后向安全(泄露后恢复)。
AES-NI(AES New Instructions)
Intel/AMD CPU 的 AES 硬件加速指令集,GCM 模式下可达 1-2 GB/s 吞吐。

6. 密码学算法分类体系 — 包图(Package Diagram)

包图展示密码学算法的完整分类树,从顶层安全目标出发,按加密方式、哈希、签名等维度逐级分类,涵盖当前推荐和已弃用的算法。

PlantUML diagram
图 6-1:密码学算法分类包图(Package Diagram)

7. 加密基元类模型 — 类图(Class Diagram)

类图展示密码学基础类型的抽象继承关系和组合关系:Cipher、Hash、MAC、KDF、AEAD 等基元的 API 模型。

PlantUML diagram
图 7-1:密码基元类图(Class Diagram)
API 防御性设计
高层 API 封装底层算法,默认安全(防误用)。如 libsodium 的 crypto_secretbox 集成加密+认证,不暴露裸 AES。
组合优于继承
密码学中 MAC 不是 Cipher 的子类(不能解密),AEAD 组合 Cipher 和 MAC 两个接口。
Demo:Python cryptography 库 API 示例
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
nonce = os.urandom(12)

ct = aesgcm.encrypt(nonce, b"secret message", b"auth data")
pt = aesgcm.decrypt(nonce, ct, b"auth data")
assert pt == b"secret message"

8. 密码学系统部署架构 — 部署图(Deployment Diagram)

部署图展示密码学在不同环境中的部署形态:客户端(移动/桌面/浏览器)、服务端(负载均衡/TLS 终结)、HSM 设备、区块链节点。

PlantUML diagram
图 8-1:密码学系统部署图(Deployment Diagram)
mTLS(Mutual TLS)
双向 TLS 认证,服务端和客户端互相验证证书,常用于微服务间零信任通信(如 Istio Service Mesh)。
TLS 终结(TLS Termination)
在反向代理(Nginx/Envoy)上解密 TLS,内网以 HTTP 转发。优点:集中证书管理和加速卸载。
PKCS#11
密码令牌接口标准,应用程序通过统一 API 访问 HSM 设备的密码学操作,厂商无关。

9. Demo 代码演示

9.1 多语言对称加密示例

Go — AES-256-GCM
package main

import (
  "crypto/aes"
  "crypto/cipher"
  "crypto/rand"
  "io"
)

func encrypt(plaintext, key []byte) ([]byte, error) {
  block, _ := aes.NewCipher(key)
  aesgcm, _ := cipher.NewGCM(block)
  nonce := make([]byte, aesgcm.NonceSize())
  io.ReadFull(rand.Reader, nonce)
  return aesgcm.Seal(nonce, nonce, plaintext, nil), nil
}
Rust — ChaCha20Poly1305
use chacha20poly1305::{
    ChaCha20Poly1305, Key, Nonce, aead::Aead
};
use rand::rngs::OsRng;

let key = Key::from_slice(&[0u8; 32]);
let cipher = ChaCha20Poly1305::new(key);
let nonce = Nonce::from_slice(&[0u8; 12]);

let ct = cipher.encrypt(nonce, b"hello".as_ref())
    .expect("encryption failure");

9.2 数字签名与密钥交换

Ed25519 签名(Go)
package main

import (
  "crypto/ed25519"
  "crypto/rand"
)

pub, priv, _ := ed25519.GenerateKey(rand.Reader)
message := []byte("hello world")
sig := ed25519.Sign(priv, message)
ok := ed25519.Verify(pub, message, sig)
// ok == true
X25519 密钥交换(Python)
from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes

alice = X25519PrivateKey.generate()
bob = X25519PrivateKey.generate()

alice_shared = alice.exchange(bob.public_key())
bob_shared = bob.exchange(alice.public_key())
assert alice_shared == bob_shared

derived = HKDF(
    algorithm=hashes.SHA256(), length=32, salt=None, info=b'handshake',
).derive(alice_shared)

9.3 密码哈希与存储

Argon2id 密码哈希(Go)
import "golang.org/x/crypto/argon2"

func hashPassword(pw, salt []byte) []byte {
  return argon2.IDKey(pw, salt,
    1,         // iterations
    64*1024,   // memory (64 MB)
    4,         // parallelism
    32,        // 输出 32 bytes
  )
}
// OWASP 2023 推荐:
// iterations≥2, memory≥46MB
BLAKE3 哈希(Python)
import blake3

h = blake3.blake3(b"hello world")
digest = h.digest()       # 32 bytes
hex_digest = h.hexdigest()

# 增量哈希
h2 = blake3.blake3()
h2.update(b"hello ")
h2.update(b"world")
assert h2.digest() == digest

# 键控模式(MAC)
k = blake3.derive_key(b"app key")
mac = blake3.blake3(b"message", key=k).digest()

9.4 TLS 编程

Go TLS 服务端
package main

import (
  "crypto/tls"
  "net/http"
)

func main() {
  mux := http.NewServeMux()
  mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("secure"))
  })
  srv := &http.Server{
    Addr: ":8443",
    Handler: mux,
    TLSConfig: &tls.Config{
      MinVersion: tls.VersionTLS13,
      CurvePreferences: []tls.CurveID{
        tls.X25519,
      },
    },
  }
  srv.ListenAndServeTLS("cert.pem", "key.pem")
}
Rust rustls 客户端
use std::sync::Arc;
use rustls::ClientConfig;

let root_store = rustls::RootCertStore {
    roots: webpki_roots::TLS_SERVER_ROOTS.to_vec(),
};
let config = ClientConfig::builder()
    .with_root_certificates(root_store)
    .with_no_client_auth();

let server_name = "example.com"
    .try_into()
    .unwrap();
let mut conn = rustls::ClientConnection::new(
    Arc::new(config), server_name
).unwrap();

10. 实战速查手册(Quick Reference)

10.1 算法选择速查(2024+)

用途首选备选国密
对称加密 AES-256-GCM ChaCha20-Poly1305 SM4-CTR
密钥交换 X25519 X448 SM2 KEX
数字签名 Ed25519 Ed448, ECDSA SM2 Sign
哈希 SHA-256 BLAKE2b, SHA3-256 SM3
密码存储 Argon2id bcrypt (cost≥12) -
MAC HMAC-SHA256 KMAC -
KDF HKDF-SHA256 - -
安全通道 TLS 1.3 WireGuard GM/T TLS
后量子 KEM Kyber (ML-KEM) - -

10.2 坚决禁止列表

禁用技术原因替代方案
MD5已破解(2004 王小云)SHA-256
SHA-1实际碰撞(SHAttered 2017)SHA-256
RC4严重偏差漏洞ChaCha20
DES / 3DES密钥过短 / 慢AES
ECB 模式模式泄露(企鹅图)GCM / CTR
CBC 模式 (新系统)Padding OracleGCM
RSA PKCS#1 v1.5 加密Bleichenbacher 攻击RSA-OAEP, ECDH
RSA-1024可分解RSA-2048+
SSL 2.0 / 3.0 / TLS 1.0 / 1.1多重攻击TLS 1.3
rand() / Math.random()非密码学安全crypto/rand / getrandom()
自研密码算法100% 有漏洞使用标准化算法
密码学第一定律:不要自己设计密码算法。使用经过同行评审的标准实现(OpenSSL、libsodium、RustCrypto),永远不要"创造"算法或模式。

10.3 TLS 1.3 密码套件速查

套件名场景
TLS_AES_128_GCM_SHA256强制实现通用场景,硬件加速好
TLS_AES_256_GCM_SHA384高安全需求
TLS_CHACHA20_POLY1305_SHA256推荐移动端纯软件性能优秀
TLS_AES_128_CCM_SHA256IoT / 受限设备

10.4 编程库选择速查

语言首选说明
C/C++libsodiumNaCl 继承,新项目首选,安全默认
C/C++ (全功能)OpenSSL 3.x全能但 API 复杂,历史负担重
C/C++ (嵌入式)mbedTLS / wolfSSL轻量,ARM 维护
RustRustCrypto + rustls纯 Rust,类型安全,零开销
Gocrypto/* 标准库Google 维护,性能优秀
Pythoncryptography高层+底层 API,推荐
JS/Node内置 crypto / Web Crypto标准库,libsodium.js 做补充
Java/KotlinGoogle Tink防误用高层 API
SwiftCryptoKitApple 原生,硬件加速
国密Tongsuo (铜锁)蚂蚁集团,国密+TLS

10.5 OpenSSL 常用命令速查

操作命令
生成 Ed25519 密钥openssl genpkey -algorithm ED25519 -out key.pem
提取公钥openssl pkey -in key.pem -pubout -out pub.pem
生成自签证书openssl req -x509 -newkey ed25519 -keyout key.pem -out cert.pem -days 365 -nodes
查看证书openssl x509 -in cert.pem -text -noout
生成 CSRopenssl req -new -key key.pem -out req.csr
计算 SHA-256openssl dgst -sha256 file.bin
生成随机字节openssl rand -hex 32
AES-GCM 加密openssl enc -aes-256-gcm -K hexkey -iv hexiv -in plain -out cipher
TLS 连接测试openssl s_client -connect host:443 -tls1_3
证书指纹openssl x509 -in cert.pem -fingerprint -sha256
速度基准openssl speed -evp aes-256-gcm
检查私钥openssl pkey -in key.pem -check -noout

10.6 STRIDE 威胁建模

威胁类型含义防护手段
Spoofing (欺骗)冒充合法用户或服务数字签名 + 证书 (mTLS)
Tampering (篡改)数据在传输或存储中被修改AEAD / HMAC / 数字签名
Repudiation (否认)行为后可抵赖数字签名 + 时间戳 + 审计日志
Information Disclosure (泄露)数据被未授权方获取加密 (TLS/AES)
Denial of Service (拒绝服务)服务不可用限流 / 冗余 / 无状态设计
Elevation of Privilege (提权)获取未授权的权限最小权限 / 零信任 / RBAC

10.7 密钥长度对照

安全级别对称RSAECC哈希
80-bit801024160160
112-bit1122048224224
128-bit (推荐)1283072256256
192-bit1927680384384
256-bit25615360512512

11. 特殊签名方案与 ECDSA 陷阱

11.1 特殊签名方案

方案特性应用
Schnorr 签名线性可聚合,高效批量验证Bitcoin Taproot (BIP-340)
BLS 签名短签名,原生支持聚合Ethereum 2.0 验证者签名
环签名 Ring Signature签名者匿名在群组内Monero 隐私交易
盲签名 Blind Signature签名者不知晓签名内容电子投票、匿名凭证
群签名 Group Signature群组签名可追溯企业审计、可信硬件
门限签名 Thresholdm-of-n 阈值签名重建MPC 钱包 (Fireblocks/Copper)
多重签名 Multi-sig多密钥独立签名验证Bitcoin 多签地址
Lamport 签名哈希一次性签名后量子候选,SPHINCS+ 基础

11.2 ECDSA 签名时序图 — Nonce 重用的毁灭性后果

PlantUML diagram
图 11-1:ECDSA Nonce 重用攻击时序图(Sequence Diagram)
ECDSA Nonce 重用 = 私钥完全暴露。PS3(2010)、Bitcoin 多次因 nonce 重用被盗。解决方案:(1) 使用 RFC 6979 确定性 nonce;(2) 改用 Ed25519,其设计天然确定性 nonce,无随机数风险。
Malleability(可延展性)
ECDSA 签名 (r, s) 可被变形为 (r, -s mod n) 仍为有效签名。Bitcoin 通过 SegWit 隔离见证解决此问题。
RFC 6979 确定性 ECDSA
使用 HMAC 从私钥和消息哈希确定性派生 nonce k,消除随机数源风险。全标准化。

12. Noise Protocol Framework — 时序图(Sequence Diagram)

Noise 是模块化构建安全通道的协议框架,WireGuard(Noise_IK)、WhatsApp、Slack 底层均使用。核心组件:DH 密钥交换 + HKDF 密钥派生 + AEAD 加密。

PlantUML diagram
图 12-1:Noise_XX 握手时序图(Sequence Diagram)
MixKey(c_k, input_key_material)
Noise 核心操作:HKDF(c_k, ikm) → 新 c_k + temp_k。链式派生保证一个密钥泄露不影响其他。
握手模式命名规则
N=无静态密钥, K=已知对方静态, X=传输静态, I=立即传输静态。如 NN(无认证), KK(双向静态已知), IK(发起方立即认证)。
协议Noise 模式说明
WireGuardNoise_IK发起方立即认证,响应方动态公布
WhatsAppNoise_XX + Double Ratchet双向动态认证 + 棘轮持续更新
Slack NebulaNoise_XX双向认证覆盖网络
Lightning NetworkNoise_XK已知响应方静态密钥
cacophony (Go) — 简洁 Noise 实现示例
import "github.com/audibleblink/cacophony"

cfg := cacophony.Config{
    Pattern: "XX",
    Cipher:  "AESGCM",
    Curve:   "25519",
}
hs := cacophony.NewHandshakeState(cfg, cacophony.Initiator, nil, nil)
hs.WriteMessage(nil, nil)
hs.ReadMessage(nil, nil)
enc, dec := hs.Split()

13. 零知识证明 ZKP — 时序图(Sequence Diagram)

零知识证明允许证明者向验证者证明某陈述为真,而不泄露任何额外信息。满足完备性(真陈述可证)、可靠性(假陈述不可证)、零知识性。

PlantUML diagram
图 13-1:ZKP Schnorr 协议交互时序图(Sequence Diagram)
方案特点证明大小应用
zk-SNARK (Groth16)需可信设置,极小证明~200 bytesZcash, Tornado Cash
zk-SNARK (PLONK)通用可信设置~800 bytesAztec, Mina
zk-STARK无可信设置,抗量子~100 KBStarkNet, StarkWare
Bulletproofs无可信设置,短证明~700 bytesMonero 隐私交易
Toxic Waste(毒性废料):zk-SNARK 可信设置阶段产生的随机参数,若未安全销毁,攻击者可用其伪造任意证明。PLONK 的通用设置和多参与方 MPC 仪式可缓解此风险。

14. 同态加密 HE — 组件图(Component Diagram)

同态加密允许在不解密的情况下对密文进行计算,结果解密后等价于对明文直接计算。按支持运算次数分级:部分同态 (PHE)、部分全同态 (SWHE)、全同态 (FHE)。

PlantUML diagram
图 14-1:同态加密分类组件图(Component Diagram)
Bootstrapping(自举)
FHE 核心操作:将密文"刷新"以降低噪声,使得无限次运算成为可能。TFHE 的自举在毫秒级,是当前最快方案。
噪声累积
每次同态运算都会增加密文噪声,超过阈值后解密失败。自举可以重置噪声水平。

15. 安全多方计算 MPC — 时序图(Sequence Diagram)

MPC 允许多方在不泄露各自输入的前提下联合计算某个函数。核心技术:秘密共享、混淆电路、不经意传输。

PlantUML diagram
图 15-1:Yao 混淆电路 MPC 时序图(Sequence Diagram)
技术路线通信量计算量适用方数代表工具
混淆电路 Yao GC低高 (AES 调用多)2EMP-toolkit
秘密共享 GMW/SPDZ高中任意MP-SPDZ
不经意传输 OT预计算低(在线期)2libOTe
同态 + MPC 混合低极高任意SCALE-MAMBA
MPC 核心局限:诚实多数假设 — 大多数协议要求半数以上参与者诚实。恶意敌手模型下性能大幅下降。门限签名钱包 (Fireblocks/Copper) 是 MPC 最成功的商业应用。

16. 区块链密码学 — 组件图(Component Diagram)

PlantUML diagram
图 16-1:区块链密码学组件图(Component Diagram)
Merkle Tree(默克尔树)
哈希二叉树,叶节点为原始数据哈希,逐层哈希到根。O(log n) 验证成员。Bitcoin 区块头存 Merkle Root,轻节点用 Merkle Proof 验证交易。
KZG 承诺(Kate-Zaverucha-Goldberg)
多项式承诺方案,Ethereum Proto-Danksharding (EIP-4844) 用于 Blob 验证。支持高效批量证明和向量承诺。
Stealth Address(隐身地址)
每次收款生成一次性地址,外部无法关联到真实地址。Monero 和 Zcash 均使用。

16.1 区块链签名算法对比

链签名算法哈希特色
BitcoinECDSA secp256k1 → SchnorrSHA-256 × 2Taproot 升级后支持 Schnorr 聚合
EthereumECDSA secp256k1Keccak-256BLS 用于 Eth2 共识签名
SolanaEd25519SHA-256硬件友好,GPU 加速验证
CardanoEd25519 + BLSBLAKE2b双签名方案,BLS 用于 KES
Polkadotsr25519 (Schnorr/Ed25519 混合)BLAKE2高效批量验证
MoneroEd25519 + Ring SignaturesKeccak环签名隐藏发送者
Zcashzk-SNARK (Groth16)BLAKE2b零知识保护交易金额和地址

17. 匿名通信 — 部署图(Deployment Diagram)

PlantUML diagram
图 17-1:匿名通信系统部署图(Deployment Diagram)
系统路由机制延迟适用场景
Tor洋葱路由,3层中继加密高 (300ms+)匿名浏览、隐藏服务
I2P大蒜路由,单向隧道极高内部匿名网络
Mixminion多轮混合,批量延迟极高 (分钟级)强匿名邮件(学术)
SignalSealed Sender 隐藏发送者低即时通讯

18. 密码学历史里程碑

年份事件
1976Diffie-Hellman 密钥交换论文发表,公钥密码学元年
1977RSA 算法发布 (Rivest-Shamir-Adleman)
1985椭圆曲线密码 ECC 独立提出 (Koblitz, Miller)
1991PGP (Pretty Good Privacy) 发布,首个大众加密工具
1994Shor 量子算法发布,威胁 RSA/ECC;SSL 2.0 (Netscape)
2000AES (Rijndael) 选定为新加密标准 (FIPS 197)
2004王小云团队破解 MD5 碰撞;SHA-1 理论攻击
2008Bitcoin 白皮书发布,中本聪创世区块
2013Snowden 事件揭露大规模监控;Signal Protocol 诞生
2017SHAttered:Google 实现 SHA-1 实际碰撞
2018TLS 1.3 (RFC 8446);WireGuard 发布
2019Argon2 选定为密码哈希标准 (OWASP 推荐)
2022zk-Rollups 在以太坊大规模部署
2024-2025NIST 后量子密码标准 FIPS 203/204/205 正式发布 (Kyber/Dilithium/SPHINCS+)

文档维护:深圳市微架构科技有限公司 / 董事会 / 全球产品 - 编码系统