返回 Expert 笔记
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-256Grover → 128 bit (仍安全)
SHA-256Grover → 128 bit (抗碰撞 ~85 bit, marginal)
Merkle同 hash
ECDSA / EdDSA / SchnorrShor 多项式破
BLS / KZGShor 多项式破
Pedersenbinding 失效 (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)

对称 / 哈希

  1. AES 的 SubBytes 为什么能抗差分攻击?
  2. GCM 模式为什么 IV 重用是灾难?
  3. SHA-256 vs Keccak-256 (Solidity) 区别?
  4. 长度扩展攻击 vs HMAC 设计?
  5. Argon2 vs scrypt 优劣?
  6. Merkle tree 第二原像攻击如何防御?

签名

  1. ECDSA nonce 重用如何泄漏私钥?
  2. Schnorr vs ECDSA 在多签上为何更优?
  3. EdDSA 强制确定性 nonce 的取舍?
  4. BLS 如何实现完美聚合?为何以太坊 PoS 选 BLS?
  5. Rogue Key Attack 是什么?如何防御?
  6. Sony PS3 案例的密码学教训?

承诺与多项式

  1. Pedersen commitment 为何 perfect hiding?
  2. KZG 与 Bulletproofs IPA 取舍?
  3. Trusted Setup ceremony 的安全前提?
  4. 为何 ZK 项目用 Pedersen hash 而非 SHA-256?
  5. KZG multi-point 如何 1 个证明搞定?

Verkle / 状态

  1. Verkle vs Merkle witness size 节省多少?
  2. 为何 Verkle 选 Banderwagon 而非 BLS12-381?
  3. Stateless client 真可行吗?挑战在哪?
  4. Eth Verkle 升级 (EIP-6800) 主要风险?

后量子

  1. NIST PQC 标准时间表?
  2. Dilithium / Falcon / SPHINCS+ 各自优劣?
  3. Web3 PQ 路线图为何缓慢?
  4. 量子破 ECDSA 还要多久?

阈值签名

  1. TSS vs Multisig 取舍?
  2. FROST vs GG20 哪个更安全?
  3. 阈值 BLS 为何如此简单?
  4. Fireblocks 类 MPC 钱包真比硬件安全吗?
  5. 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

七、开发者资源清单

核心库

语言用途
libsecp256k1CBitcoin/Eth ECDSA 标准
noble-curvesTypeScript浏览器/Node.js 全曲线
coincurvePythonsecp256k1 wrapper
pyca/cryptographyPython高层 PCS
nacl / pynaclPythonNaCl Ed25519/Curve25519
py_eccPythonBLS12-381 / KZG (Eth-flavored)
blstC/Rust高性能 BLS12-381 (Eth/Filecoin 主力)
arkworksRust通用 SNARK / 曲线生态
oqs (Open Quantum Safe)CNIST PQC 全套
tss-lib (Binance)GoGG20 ECDSA TSS
frost-secp256k1RustRFC 9591 FROST
go-verkleGoEth Verkle ref impl

论文必读

  1. AES: Daemen-Rijmen "AES Proposal" (1998)
  2. SHA-256: NIST FIPS 180-4
  3. Schnorr: Schnorr "Efficient Signature Generation by Smart Cards" (1991)
  4. ECDSA: ANSI X9.62 (1998)
  5. EdDSA: Bernstein et al. "High-speed high-security signatures" (2011)
  6. BLS: Boneh-Lynn-Shacham "Short signatures from the Weil pairing" (2001)
  7. Pedersen: Pedersen "Non-interactive and Information-theoretic Secure Verifiable Secret Sharing" (1991)
  8. KZG: Kate-Zaverucha-Goldberg "Constant-Size Commitments to Polynomials" (2010)
  9. Verkle: Kuszmaul "Verkle Trees" (2018)
  10. FROST: Komlo-Goldberg "FROST: Flexible Round-Optimized Schnorr Threshold Signatures" (2020)
  11. GG20: Gennaro-Goldfeder "One Round Threshold ECDSA with Identifiable Abort" (2020)
  12. 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 总结

学到的底层观念

  1. 没有"绝对安全": 所有方案都建立在某些"困难假设"上 (DLP / RSA / lattice / hash collision)
  2. 工程实现 > 数学优雅: Sony PS3 不是 ECDSA 数学错,是工程实现错
  3. 协议复合不是模块化: TLS BEAST/POODLE 都是协议层 + 实现层叠加问题
  4. 后量子是工程问题不是密码学问题: 算法已就绪,部署是难点
  5. 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 学习打基础。