Module 01: Applied Cryptography
从 Hash 函数、非对称加密到零知识证明,建立区块链安全保证的密码学基础
区块链的安全性不依赖任何中心化机构,而是完全建立在密码学之上。理解密码学原理,是理解区块链为什么可信的前提。本模块覆盖四个核心主题:Hash 函数、非对称加密、Merkle Tree 和零知识证明。
Hash 函数
Hash 函数接收任意长度的输入,输出固定长度的摘要。区块链最常用的是 SHA-256(Secure Hash Algorithm,输出 256 位)。
核心性质:
- 确定性:相同输入永远产生相同输出
- 雪崩效应:输入改变 1 bit,输出变化超过 50%
- 抗碰撞性:找到两个不同输入产生相同输出,在计算上不可行
- 单向性:从输出无法反推输入
Python 演示:
import hashlib
msg1 = "Hello"
msg2 = "hello" # 仅首字母大小写不同
h1 = hashlib.sha256(msg1.encode()).hexdigest()
h2 = hashlib.sha256(msg2.encode()).hexdigest()
print(h1) # 185f8db32271fe25f561a6fc938b2e26...
print(h2) # 2cf24dba5fb0a30e26e83b2ac5b9e29e...
# 两个哈希值完全不同——这就是雪崩效应
Bitcoin 中的应用:
- 区块哈希:每个区块头经过两次 SHA-256(
SHA256(SHA256(block_header))),生成区块的唯一标识。矿工通过调整 nonce 值反复计算,直到哈希值小于目标难度——这就是工作量证明(Proof of Work)。 - Merkle Root:区块内所有交易的哈希值两两配对、逐层向上哈希,最终得到一个根哈希,写入区块头。任何一笔交易被篡改,根哈希都会改变。
非对称加密
传统加密(AES 等)用同一把密钥加解密,双方必须安全交换密钥。非对称加密用一对密钥解决这个问题:
- 私钥:随机生成的 256 位数字,必须保密
- 公钥:通过椭圆曲线算法从私钥推导,可以公开
- 私钥能推出公钥,但公钥无法反推私钥
椭圆曲线数字签名算法(ECDSA):
Bitcoin 使用 secp256k1 曲线。交易签名流程:
- 发送方用私钥对交易数据的哈希值进行签名,生成签名 (r, s)
- 签名和公钥一起附在交易中广播到网络
- 任何节点都能用公钥验证签名的有效性——确认交易确实由私钥持有者发起
# 概念演示(实际实现使用 ecdsa 或 coincurve 库)
from hashlib import sha256
# 1. 私钥 → 公钥(椭圆曲线点乘)
# private_key = random 256-bit number
# public_key = private_key * G (G 是曲线的生成点)
# 2. 签名
# msg_hash = sha256(transaction_data)
# signature = sign(msg_hash, private_key) → (r, s)
# 3. 验证
# verify(msg_hash, signature, public_key) → True/False
地址生成链路: 私钥 → ECDSA → 公钥 → SHA-256 → RIPEMD-160 → Base58Check 编码 → Bitcoin 地址。
这条链路是单向的。知道 Bitcoin 地址无法反推公钥,知道公钥无法反推私钥。
Merkle Tree
Merkle Tree(哈希树)是一种二叉树数据结构,叶节点是各交易的哈希值,每个非叶节点是其两个子节点哈希值的拼接再哈希。
Merkle Root
/ \
H(AB) H(CD)
/ \ / \
H(A) H(B) H(C) H(D)
| | | |
Tx A Tx B Tx C Tx D
高效验证原理:
要验证 Tx C 是否在区块中,不需要下载全部交易。只需要:
- H(D)(Tx C 的兄弟节点哈希)
- H(AB)(上一层的兄弟节点哈希)
- Merkle Root(区块头中已有)
用 H(C) 和 H(D) 算出 H(CD),再和 H(AB) 算出根哈希,与区块头中的 Merkle Root 对比。如果一致,证明 Tx C 确实在这个区块中。
复杂度:一个包含 N 笔交易的区块,验证一笔交易只需要 log₂(N) 个哈希值。1000 笔交易只需 10 个哈希。
SPV 节点:简单支付验证(Simplified Payment Verification)节点利用这个特性,只下载区块头(80 字节/区块),通过 Merkle Proof 验证交易是否被确认,不需要存储完整区块链。手机钱包就是典型的 SPV 客户端。
零知识证明 (ZKP)
零知识证明允许证明者(Prover)向验证者(Verifier)证明某个陈述为真,同时不泄露任何额外信息。
经典类比:一个山洞有两条通道 A 和 B,在深处连通,连通处有一扇需要密码的门。证明者想证明自己知道密码,但不想透露密码本身。方法:证明者随机选一条通道进入,验证者在洞口喊出要求从哪条通道出来。如果证明者知道密码,每次都能从指定通道出来;不知道密码,每次只有 50% 的概率猜对。重复 20 次后,连续猜对的概率低于百万分之一。
两大技术路线:
| zk-SNARKs | zk-STARKs | |
|---|---|---|
| 全称 | Zero-Knowledge Succinct Non-interactive ARguments of Knowledge | Zero-Knowledge Scalable Transparent ARguments of Knowledge |
| 可信设置 | 需要(初始参数生成阶段需要信任) | 不需要(透明) |
| 证明大小 | 小(~200 bytes) | 大(~50 KB) |
| 验证速度 | 快 | 较快 |
| 抗量子 | 否(依赖椭圆曲线) | 是(基于哈希函数) |
| 代表项目 | Zcash, Filecoin | StarkNet, StarkEx |
区块链应用:
- Zcash:用 zk-SNARKs 实现隐私交易。发送方证明自己有足够余额且交易有效,但不暴露发送方、接收方和金额。
- zkRollups:Layer 2 扩容方案。将数百笔交易在链下执行,生成一个零知识证明提交到主链。主链验证证明即可确认所有交易的正确性,不需要逐笔重新执行。zkSync、Scroll、Polygon zkEVM 都是这条路线。
推荐资源
| 名称 | 类型 | 说明 |
|---|---|---|
| Cryptography I - Stanford (Coursera) | 在线课程 | Dan Boneh 的密码学入门,覆盖对称加密、公钥加密、哈希函数,学术深度但讲解清晰 |
| But how does bitcoin actually work? - 3Blue1Brown | 视频 | 用可视化方式讲解 SHA-256、数字签名和工作量证明,适合建立直觉 |
| Bitcoin: A Peer-to-Peer Electronic Cash System | 论文 | 中本聪原始白皮书,9 页,直接读原文比任何二手解读都值 |
| Mastering Bitcoin, Chapter 4 | 书籍章节 | 密钥、地址、钱包的完整技术讲解,含代码示例 |
| ZKP MOOC (Berkeley RDI) | 在线课程 | 零知识证明系统课程,从理论到实现,适合想深入 ZKP 的学习者 |
思考题
- Hash 函数的抗碰撞性和单向性如何帮助 P2P 网络中的节点验证数据完整性?如果 Hash 函数可逆,共识机制会面临什么问题?
- 在一个没有中心权威的网络中,数字签名如何让节点确认交易的发起者身份?如果没有非对称加密,去中心化系统能否运作?
- Merkle Tree 的 log₂(N) 验证复杂度对轻节点意味着什么?想象一个有百万笔交易的区块链网络,SPV 节点如何在不信任任何单一节点的前提下工作?
下一步
密码学提供了安全保证的基础工具。下一模块将讲解这些工具如何组合成一个去中心化系统——共识机制与网络协议(Module 02)。