Expert Day 208
Week 31 复习 — 经典密码学整合 + 基础库 v1
整合 Day 195-207 全部内容到一个连贯的"经典密码学"心智图
2026-11-25
Phase 4 - 经典密码学 (Day 195-208)密码学复习基础库整合
日期: 2026-11-25 方向: 密码学 / 经典原语 阶段: Phase 4 - 经典密码学 (Day 195-208) 标签: #密码学 #复习 #基础库 #整合
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | 整合 Day 195-207 全部内容到一个连贯的"经典密码学"心智图 |
| 实操 | 搭建 crypto_lib v1 — 把所有 14 天实现的代码模块化整合,提供统一接口 |
| 产出 | crypto_lib v1 — 完整可发布密码学基础库 + 完整复习文档 |
一、Phase 4 Days 195-208 知识地图
┌─────────────────────────────────────────────────────────────────────┐
│ 经典密码学 (Day 195-208) │
└─────────────────────────────────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌────▼────┐ ┌────▼─────┐ ┌────▼────┐
│ 对称加密 │ │ 哈希 │ │ 签名 │
│ (D195) │ │ (D196-7) │ │(D198-201)│
└─────────┘ └──────────┘ └─────────┘
- AES-GCM - SHA-256 - Schnorr
- IV 重用攻击 - Merkle / SMT - ECDSA + 陷阱
- HMAC / Argon2 - EdDSA
- BLS 聚合
┌───────────────────────┼───────────────────────┐
│ │ │
┌────▼────┐ ┌────▼─────┐ ┌────▼────┐
│ 承诺 │ │ Verkle │ │ PQ + TSS│
│(D202-4) │ │ (D205) │ │(D206-7) │
└─────────┘ └──────────┘ └─────────┘
- Pedersen - Stateless - Dilithium/Falcon
- KZG - Banderwagon - SPHINCS+
- Vector commit - EIP-6800 - FROST / GG20
│
┌─────▼─────┐
│ 基础库 v1 │
│ (Day 208) │
└───────────┘
二、各模块整合
2.1 模块化结构
crypto_lib/
├── __init__.py
├── symmetric/
│ ├── aes.py # 来自 Day 195
│ └── gcm.py
├── hash/
│ ├── sha256.py # 来自 Day 196
│ ├── merkle.py # 来自 Day 197
│ └── smt.py # 来自 Day 197
├── signature/
│ ├── schnorr.py # 来自 Day 198
│ ├── ecdsa.py # 标准 ECDSA
│ ├── ecdsa_attack.py # 来自 Day 199(教学用)
│ └── bls.py # 来自 Day 200
├── commitment/
│ ├── pedersen.py # 来自 Day 202
│ └── kzg.py # 来自 Day 203
├── verkle/
│ └── tree.py # 来自 Day 205
└── tests/
└── test_all.py
2.2 顶层 API 设计
"""
crypto_lib/__init__.py
- 统一接口: crypto_lib.<primitive>(...)
"""
# Symmetric
from crypto_lib.symmetric.gcm import aes_gcm_encrypt, aes_gcm_decrypt
# Hash
from crypto_lib.hash.sha256 import sha256
from crypto_lib.hash.merkle import MerkleTree, verify_proof
from crypto_lib.hash.smt import SparseMerkleTree
# Signature
from crypto_lib.signature.schnorr import Schnorr
from crypto_lib.signature.bls import BLS
# Commitment
from crypto_lib.commitment.pedersen import commit, open_commit
from crypto_lib.commitment.kzg import KZGSetup
# Version
__version__ = "1.0.0"
__all__ = [
'aes_gcm_encrypt', 'aes_gcm_decrypt',
'sha256', 'MerkleTree', 'verify_proof', 'SparseMerkleTree',
'Schnorr', 'BLS',
'commit', 'open_commit', 'KZGSetup',
]
2.3 用法示例
"""
crypto_lib_demo.py - 演示 14 天的所有原语
"""
import os
from crypto_lib import (
aes_gcm_encrypt, aes_gcm_decrypt,
sha256, MerkleTree, verify_proof,
Schnorr, BLS,
commit, open_commit, KZGSetup,
)
print("=" * 70)
print(" crypto_lib v1 - Classical Cryptography Demo")
print("=" * 70)
# 1. AES-GCM
print("\n[1] Symmetric: AES-GCM")
key = os.urandom(16)
iv = os.urandom(12)
ct, tag = aes_gcm_encrypt(key, iv, b"hello", aad=b"v1")
pt = aes_gcm_decrypt(key, iv, ct, tag, aad=b"v1")
print(f" ✓ Encrypt/decrypt: {pt}")
# 2. Hash
print("\n[2] Hash: SHA-256")
h = sha256(b"abc")
print(f" ✓ sha256('abc') = {h.hex()[:32]}...")
# 3. Merkle Tree
print("\n[3] Merkle Tree (1024 leaves)")
leaves = [f"tx_{i}".encode() for i in range(1024)]
tree = MerkleTree(leaves)
proof = tree.prove(42)
assert verify_proof(tree.root, proof)
print(f" ✓ Root: {tree.root.hex()[:32]}...")
print(f" ✓ Proof for leaf 42: {len(proof.siblings)} siblings × 32 B = {len(proof.siblings)*32} B")
# 4. Schnorr signature
print("\n[4] Schnorr signature (BIP-340)")
sk, pk = Schnorr.keygen(b'\x42' * 32)
msg = sha256(b"transaction")
sig = Schnorr.sign(sk, msg)
assert Schnorr.verify(pk, msg, sig)
print(f" ✓ Verified, sig = {sig.hex()[:32]}...")
# 5. BLS (skipped if py_ecc unavailable)
print("\n[5] BLS aggregate signature")
try:
sks_pks = [BLS.keygen(os.urandom(32)) for _ in range(5)]
sigs = [BLS.sign(sk, b"shared_msg") for sk, pk in sks_pks]
agg_sig = BLS.aggregate_sigs(sigs)
pks = [pk for _, pk in sks_pks]
assert BLS.fast_verify_same_msg(pks, b"shared_msg", agg_sig)
print(f" ✓ 5 sigs aggregated to 1 (96 B), verified with 1 pairing")
except Exception as e:
print(f" (skipped: {e})")
# 6. Pedersen commitment
print("\n[6] Pedersen commitment (homomorphic)")
import secrets
N_curve = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
m = 100
r = secrets.randbelow(N_curve)
c = commit(m, r)
assert open_commit(c, m, r)
print(f" ✓ commit(100, r) opened correctly")
# 7. KZG (skipped if py_ecc unavailable)
print("\n[7] KZG polynomial commitment")
try:
setup = KZGSetup(max_degree=10)
coeffs = [5, 7, 3, 0, 2]
C = setup.commit(coeffs)
print(f" ✓ Committed degree-4 poly, C = single G1 element")
except Exception as e:
print(f" (skipped: {e})")
print("\n" + "=" * 70)
print(" All primitives PASSED")
print("=" * 70)
三、安全性总结
3.1 困难假设依赖图
┌─────────────────┐
│ 随机预言机 │
│ (ROM) │
└────────┬────────┘
│
┌────────────┬───────────┴───────────┬────────────┐
│ │ │ │
┌───▼────┐ ┌────▼────┐ ┌──────▼─────┐ ┌────▼────┐
│ hash │ │ ECDLP │ │ pairing │ │ Lattice │
│ collision │ │ (DLP) │ │ co-CDH │ │ MLWE/SIS│
└────┬───┘ └────┬────┘ └──────┬─────┘ └────┬────┘
│ │ │ │
│ │ │ │
┌────▼────┐ ┌────▼────────┬──────────┐ │ ┌────▼────────┐
│ SHA-256 │ │ ECDSA │ Schnorr │ │ │ Dilithium │
│ Merkle │ │ EdDSA │ Pedersen │ │ │ Falcon │
│ HMAC │ │ Bulletproofs│ MuSig2 │ │ └─────────────┘
└─────────┘ └─────────────┴──────────┘ │
│
┌──────▼──────┐
│ BLS │
│ KZG │
└─────────────┘
3.2 后量子状态
| 方案 | 量子破? |
|---|---|
| AES-256 | Grover → 128 bit (仍安全) |
| SHA-256 | Grover → 128 bit (抗碰撞 ~85 bit, marginal) |
| Merkle | 同 hash |
| ECDSA / EdDSA / Schnorr | Shor 多项式破 |
| BLS / KZG | Shor 多项式破 |
| Pedersen | binding 失效 (DLP),hiding 完美依然 |
| Dilithium / Falcon / SPHINCS+ | ✓ 后量子安全 |
四、Web3 应用全景图
Bitcoin ────────── ECDSA (legacy) ──────► Schnorr/MuSig2 (Taproot)
│
└──► SHA-256 (PoW + Merkle)
Ethereum L1 ───── ECDSA (EOA) ──── Keccak-256 ──── MPT ──► Verkle (future)
│
├──► BLS12-381 (PoS validators)
├──► KZG (4844 blobs)
└──► Pedersen (Tornado/Aztec privacy)
Solana / Sui / Aptos ──── Ed25519
Cosmos / Tendermint ───── Ed25519 (validators) + secp256k1 (accounts)
ZK Rollups (zkSync/Scroll/Polygon) ── KZG / Halo IPA + Poseidon hash
Zcash ────── Sapling: Pedersen hash + JubJub Schnorr + Groth16
Privacy (Monero) ── Pedersen RingCT + Bulletproofs
Cross-chain bridges ── TSS (GG20 / FROST)
MPC custody (Fireblocks/ZenGo) ── GG20 / CGGMP / DKLs
五、面试题大汇总(Top 30)
对称 / 哈希
- AES 的 SubBytes 为什么能抗差分攻击?
- GCM 模式为什么 IV 重用是灾难?
- SHA-256 vs Keccak-256 (Solidity) 区别?
- 长度扩展攻击 vs HMAC 设计?
- Argon2 vs scrypt 优劣?
- Merkle tree 第二原像攻击如何防御?
签名
- ECDSA nonce 重用如何泄漏私钥?
- Schnorr vs ECDSA 在多签上为何更优?
- EdDSA 强制确定性 nonce 的取舍?
- BLS 如何实现完美聚合?为何以太坊 PoS 选 BLS?
- Rogue Key Attack 是什么?如何防御?
- Sony PS3 案例的密码学教训?
承诺与多项式
- Pedersen commitment 为何 perfect hiding?
- KZG 与 Bulletproofs IPA 取舍?
- Trusted Setup ceremony 的安全前提?
- 为何 ZK 项目用 Pedersen hash 而非 SHA-256?
- KZG multi-point 如何 1 个证明搞定?
Verkle / 状态
- Verkle vs Merkle witness size 节省多少?
- 为何 Verkle 选 Banderwagon 而非 BLS12-381?
- Stateless client 真可行吗?挑战在哪?
- Eth Verkle 升级 (EIP-6800) 主要风险?
后量子
- NIST PQC 标准时间表?
- Dilithium / Falcon / SPHINCS+ 各自优劣?
- Web3 PQ 路线图为何缓慢?
- 量子破 ECDSA 还要多久?
阈值签名
- TSS vs Multisig 取舍?
- FROST vs GG20 哪个更安全?
- 阈值 BLS 为何如此简单?
- Fireblocks 类 MPC 钱包真比硬件安全吗?
- DKG 中如何容错恶意参与者?
六、实战 Cheatsheet
Web3 工程师每日决策
开发新协议?
├── 选签名方案
│ ├── 兼容 EVM → ECDSA secp256k1
│ ├── PoS 共识 → BLS12-381
│ ├── 高频交易 → Ed25519
│ ├── 跨链多签 → FROST (Schnorr)
│ └── 长期 vault → Hybrid ECDSA+Dilithium
│
├── 选哈希
│ ├── 通用 → SHA-256 / Keccak
│ ├── 密码 → Argon2id
│ ├── ZK 友好 → Poseidon
│ └── 高性能 → Blake3
│
├── 选承诺
│ ├── 隐私转账 → Pedersen
│ ├── 多项式 (PLONK) → KZG
│ ├── 无 setup → Bulletproofs IPA
│ └── 后量子 → FRI / Merkle
│
└── 选阈值方案
├── ECDSA chain → DKLs19 / CGGMP
├── Schnorr chain → FROST
├── BLS chain → 阈值 BLS (简单)
└── 链上多签 → Safe wallet
七、开发者资源清单
核心库
| 库 | 语言 | 用途 |
|---|---|---|
libsecp256k1 | C | Bitcoin/Eth ECDSA 标准 |
noble-curves | TypeScript | 浏览器/Node.js 全曲线 |
coincurve | Python | secp256k1 wrapper |
pyca/cryptography | Python | 高层 PCS |
nacl / pynacl | Python | NaCl Ed25519/Curve25519 |
py_ecc | Python | BLS12-381 / KZG (Eth-flavored) |
blst | C/Rust | 高性能 BLS12-381 (Eth/Filecoin 主力) |
arkworks | Rust | 通用 SNARK / 曲线生态 |
oqs (Open Quantum Safe) | C | NIST PQC 全套 |
tss-lib (Binance) | Go | GG20 ECDSA TSS |
frost-secp256k1 | Rust | RFC 9591 FROST |
go-verkle | Go | Eth Verkle ref impl |
论文必读
- AES: Daemen-Rijmen "AES Proposal" (1998)
- SHA-256: NIST FIPS 180-4
- Schnorr: Schnorr "Efficient Signature Generation by Smart Cards" (1991)
- ECDSA: ANSI X9.62 (1998)
- EdDSA: Bernstein et al. "High-speed high-security signatures" (2011)
- BLS: Boneh-Lynn-Shacham "Short signatures from the Weil pairing" (2001)
- Pedersen: Pedersen "Non-interactive and Information-theoretic Secure Verifiable Secret Sharing" (1991)
- KZG: Kate-Zaverucha-Goldberg "Constant-Size Commitments to Polynomials" (2010)
- Verkle: Kuszmaul "Verkle Trees" (2018)
- FROST: Komlo-Goldberg "FROST: Flexible Round-Optimized Schnorr Threshold Signatures" (2020)
- GG20: Gennaro-Goldfeder "One Round Threshold ECDSA with Identifiable Abort" (2020)
- Dilithium: Ducas et al. "CRYSTALS-Dilithium" (2018)
八、Phase 4 Day 195-208 学习成果检验
硬性产出
- Day 195:
sym.py— AES-GCM 实现 + IV 重用攻击演示 - Day 196:
sha256.py— SHA-256 完整状态机 + 长度扩展攻击 - Day 197:
merkle.py— Merkle + SMT + HMAC - Day 198:
schnorr.py— BIP-340 Schnorr + 批量验证 - Day 199:
ecdsa_attack.py— Sony PS3 + lattice HNP - Day 200:
bls.py— BLS 聚合 + 阈值签名 - Day 201:
sig_compare.md— 签名体系完整对比 - Day 202:
pedersen.py— Pedersen 承诺 + 同态 - Day 203:
kzg.py— KZG 多项式承诺 - Day 204:
vc_compare.md— Vector commitment 对比 - Day 205:
verkle.md— Verkle 路线图深度 - Day 206:
pqc.md— NIST PQC 分析 - Day 207:
tss.md— 阈值签名分析 - Day 208:
crypto_lib v1— 整合库
能力检验
完成本周(Day 195-208)后能:
- 手写 AES-128 + GCM 完整代码
- 推导 ECDSA nonce 重用导致 key 泄漏的数学
- 实现 BLS 聚合签名 + Pairing 验证
- 解释 Pedersen 完美隐藏 + DLP 绑定
- 实现 KZG 单点 + 多点 open
- 阐述 Verkle stateless 路线图
- 比较 NIST PQC 三大签名方案
- 解释 FROST 与 GG20 设计权衡
- 选择 Web3 任意场景的密码学原语
下阶段预期 (Day 209+)
进入 Phase 4 Part 3: 现代 ZK 证明系统:
- Sigma protocols 与 Fiat-Shamir
- Groth16 / PLONK / Halo2 / STARK
- Recursive SNARKs (Nova / Folding)
- zkVM 设计 (Risc0 / SP1 / Jolt)
- 隐私协议 (Aztec / Penumbra)
九、Phase 4 Day 195-208 总结
学到的底层观念
- 没有"绝对安全": 所有方案都建立在某些"困难假设"上 (DLP / RSA / lattice / hash collision)
- 工程实现 > 数学优雅: Sony PS3 不是 ECDSA 数学错,是工程实现错
- 协议复合不是模块化: TLS BEAST/POODLE 都是协议层 + 实现层叠加问题
- 后量子是工程问题不是密码学问题: 算法已就绪,部署是难点
- ZK 把所有原语重新洗牌: hash / commit / sig 都需 ZK-friendly 版本 → 创造新的研究方向
给求职的启示
10 年金融零售 + Web3 PM/架构师求职,密码学知识能展现:
- 深度技术理解(区分入门 PM 与 senior 架构师)
- 风险识别能力(金融背景 + 密码学陷阱)
- 跨域桥接能力(CeFi 与 DeFi 的密码学差异)
可在面试中提到的"硬核"展示:
- "我手写过 AES-GCM 并复现了 IV 重用攻击"
- "我实现过 BLS 聚合签名,理解 Eth2 attestation 聚合的优化空间"
- "我研究过 Verkle 路线图,知道 stateless 客户端的实际挑战"
十、明日预告
Day 209: Sigma Protocols 与 Fiat-Shamir — 进入 ZK 证明系统的世界。从 Schnorr 识别协议泛化到 Sigma 协议族,研究 Fiat-Shamir 变换的安全性,为后续 Groth16 / PLONK 学习打基础。