我没按教科书顺序学。先解决眼前的阻塞,再回头补原理。
项目里要用零知识证明做「证明我知道密钥,但不泄露密钥」这类需求时,我发现自己对对称加密还算熟,一到 ZK-SNARK 就卡壳。这篇是按我补课的顺序整理的笔记:从已经会用的对称加密出发,一路补到零知识证明,中间踩过的概念坑也一并记下。
密码学基础
先把几个名词对齐,后面看算法时不至于懵。
密码学基本概念
明文:原始的、未加密的信息。
密文:加密后的信息。
密钥:用于加密和解密的秘密参数。
加密算法:将明文转换为密文的算法。
graph TB
subgraph 密码学基本概念
A[明文]
A --> B[加密算法]
B --> C[密文]
C --> D[解密算法]
D --> E[明文]
end
subgraph 密钥作用
F[加密密钥]
G[解密密钥]
end
B --> F
D --> G
subgraph 安全目标
H[保密性]
I[完整性]
J[认证性]
K[不可否认性]
end
A --> H
C --> I
B --> J
D --> K
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style C fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
密码学安全目标
保密性:确保信息不被未授权者获取。
完整性:确保信息不被篡改。
认证性:验证信息的来源真实性。
不可否认性:防止发送方否认发送过信息。
sequenceDiagram
participant Alice as 发送方Alice
participant Attacker as 攻击者
participant Bob as 接收方Bob
Note over Alice,Bob: 密码学安全目标演示
Alice->>Alice: 原始信息
Alice->>Bob: 加密发送<br/>(保密性)
Attacker->>Attacker: 尝试截获
Attacker->>Attacker: 无法解密
Bob->>Bob: 验证完整性
Bob->>Bob: 验证认证性
Bob->>Bob: 确不可否认性
Note over Alice,Bob: 实现所有安全目标
对称加密
日常加密用得最多的一类。速度快,麻烦在密钥怎么安全地分给对方。
对称加密原理
单一密钥:加密和解密使用相同的密钥。
快速高效:加密和解密速度快。
密钥分发:密钥的安全分发是挑战。
批量加密:适合批量数据加密。
graph TB
subgraph 对称加密流程
A[明文]
A --> B[加密算法]
B --> C[密文]
C --> D[解密算法]
D --> E[明文]
end
subgraph 密钥使用
F[密钥K]
F --> B
F --> D
end
subgraph 算法特性
G[AES]
H[DES]
I[3DES]
J[ChaCha20]
end
B --> G
B --> H
B --> I
B --> J
style F fill:#FFD700,stroke:#DAA520,stroke-width:2px
style G fill:#90EE90,stroke:#006400,stroke-width:1px
常见对称加密算法
AES:高级加密标准,广泛使用。
DES:数据加密标准,已不安全。
3DES:三重DES,相对安全但效率低。
ChaCha20:流密码,性能优异。
graph TB
subgraph 对称加密算法对比
A[AES]
B[DES]
C[3DES]
D[ChaCha20]
end
subgraph 安全性
E[高安全性]
F[已被攻破]
G[中等安全性]
H[高安全性]
end
A --> E
B --> F
C --> G
D --> H
subgraph 性能
I[高性能]
J[低性能]
K[低性能]
L[高性能]
end
A --> I
B --> J
C --> K
D --> L
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style D fill:#90EE90,stroke:#006400,stroke-width:1px
对称加密应用场景
数据传输加密:保护数据传输的安全。
数据存储加密:保护存储数据的安全。
实时通信加密:实时通信的数据保护。
批量数据加密:批量数据的加密处理。
sequenceDiagram
participant Sender as 发送方
participant Encrypt as 加密模块
participant Network as 网络传输
participant Decrypt as 解密模块
participant Receiver as 接收方
Sender->>Encrypt: 提供明文和密钥
Encrypt->>Encrypt: 执行加密
Encrypt->>Network: 发送密文
Network->>Decrypt: 传输密文
Decrypt->>Decrypt: 执行解密
Decrypt->>Receiver: 返回明文
Note over Sender,Receiver: 对称加密数据传输
非对称加密
公钥随便发、私钥自己留,密钥分发问题总算有解了。代价是算得慢。
非对称加密原理
公钥私钥:使用公钥私钥对进行加密。
密钥分发:公钥可以公开分发。
计算复杂:加密解密计算复杂度高。
数字签名:支持数字签名功能。
graph TB
subgraph 非对称加密
A[明文]
A --> B[加密算法]
B --> C[密文]
C --> D[解密算法]
D --> E[明文]
end
subgraph 密钥对
F[公钥PK]
G[私钥SK]
end
B --> F: 用公钥加密
D --> G: 用私钥解密
subgraph 数学基础
H[大整数分解]
I[离散对数]
J[椭圆曲线]
end
F --> H
G --> I
F --> J
style F fill:#90EE90,stroke:#006400,stroke-width:1px
style G fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
RSA算法
大数分解:基于大整数分解的困难性。
密钥生成:生成大素数作为密钥。
加密解密:使用模幂运算进行加密解密。
安全性:依赖于大数分解的计算复杂度。
graph TB
subgraph RSA密钥生成
A[选择大素数p,q]
A --> B[计算n = p×q]
B --> C[计算φ(n) = (p-1)(q-1)]
C --> D[选择公钥e]
D --> E[计算私钥d]
end
subgraph RSA加密
F[公钥]
F --> G[密文 = 明文^e mod n]
end
subgraph RSA解密
H[私钥]
H --> I[明文 = 密文^d mod n]
end
subgraph 安全性基础
J[大数分解困难]
J --> K[选择足够大的素数]
end
E --> J
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style J fill:#FFD700,stroke:#DAA520,stroke-width:2px
椭圆曲线密码学
椭圆曲线:基于椭圆曲线的数学性质。
短密钥:相比RSA使用更短的密钥。
高性能:计算效率更高。
广泛应用:在现代系统中广泛应用。
graph TB
subgraph ECC与RSA对比
A[RSA]
B[ECC]
end
subgraph 密钥长度
C[2048位]
D[256位]
end
A --> C
B --> D
subgraph 安全性
E[同等安全性]
end
C --> E
D --> E
subgraph 性能
F[较慢]
G[较快]
end
A --> F
B --> G
style B fill:#90EE90,stroke:#006400,stroke-width:1px
哈希函数
验文件有没有被改过、存密码该不该加盐,都离不开它。
哈希函数特性
确定性:相同输入产生相同输出。
快速计算:哈希计算速度快。
抗碰撞性:难以找到碰撞。
单向性:从哈希值难以推导出原文。
graph TB
subgraph 哈希函数特性
A[确定性]
B[快速计算]
C[抗碰撞性]
D[单向性]
end
subgraph 特性说明
E[相同输入=相同输出]
F[计算速度快]
G[难以找到碰撞]
H[难以逆推]
end
A --> E
B --> F
C --> G
D --> H
subgraph 常见算法
I[SHA-256]
J[SHA-3]
K[BLAKE2]
end
A --> I
B --> J
C --> K
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style C fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
常见哈希算法
SHA家族:安全哈希算法家族。
MD5:消息摘要算法,已不安全。
BLAKE2:现代高性能哈希算法。
SHA-3:新一代安全哈希算法。
graph TB
subgraph 哈希算法对比
A[MD5]
B[SHA-1]
C[SHA-256]
D[SHA-3]
end
subgraph 安全性
E[已被攻破]
F[已被攻破]
G[安全]
H[安全]
end
A --> E
B --> F
C --> G
D --> H
subgraph 输出长度
I[128位]
J[160位]
K[256位]
L[可变长度]
end
A --> I
B --> J
C --> K
D --> L
style C fill:#90EE90,stroke:#006400,stroke-width:1px
style D fill:#90EE90,stroke:#006400,stroke-width:1px
哈希函数应用
数据完整性:验证数据是否被篡改。
密码存储:安全存储用户密码。
区块链:区块链技术的核心组件。
数字签名:数字签名的基础。
sequenceDiagram
participant User as 用户
participant Hash as 哈希函数
participant Storage as 存储
participant Verify as 验证
User->>Hash: 输入数据
Hash->>Hash: 计算哈希值
Hash-->>User: 返回哈希值
User->>Storage: 存储数据和哈希
Note over User,Storage: 数据完整性验证
Storage->>Verify: 重新计算哈希
Verify->>Verify: 比较哈希值
alt 哈希值匹配
Verify-->>User: 数据完整
else 哈希值不匹配
Verify-->>User: 数据被篡改
end
Note over User,Verify: 数据完整性验证流程
数字签名
证明「这确实是我发的」,而且事后赖不掉。
数字签名原理
私钥签名:使用私钥对信息进行签名。
公钥验证:使用公钥验证签名。
不可伪造:没有私钥无法伪造签名。
不可否认:签名者无法否认签名。
graph TB
subgraph 数字签名生成
A[原始信息]
A --> B[哈希函数]
B --> C[信息摘要]
C --> D[私钥签名]
D --> E[数字签名]
end
subgraph 数字签名验证
F[原始信息]
F --> G[哈希函数]
G --> H[信息摘要1]
I[数字签名]
I --> J[公钥验证]
J --> K[信息摘要2]
end
subgraph 签名验证
L[比较摘要]
L --> M{摘要是否相同?}
M -->|是| N[签名有效]
M -->|否| O[签名无效]
end
H --> L
K --> L
style D fill:#FFD700,stroke:#DAA520,stroke-width:2px
style N fill:#90EE90,stroke:#006400,stroke-width:1px
数字签名应用
软件签名:软件的数字签名验证。
文档签名:电子文档的数字签名。
代码签名:代码的数字签名保护。
身份认证:基于数字签名的身份认证。
sequenceDiagram
participant Developer as 开发者
participant SignTool as 签名工具
participant User as 用户
participant VerifyTool as 验证工具
Developer->>SignTool: 提供代码和证书
SignTool->>SignTool: 计算哈希
SignTool->>SignTool: 生成数字签名
SignTool-->>Developer: 返回签名代码
Developer->>User: 分发签名代码
User->>VerifyTool: 验证签名
VerifyTool->>VerifyTool: 提取公钥
VerifyTool->>VerifyTool: 验证签名
VerifyTool-->>User: 验证结果
alt 签名有效
User->>User: 安装代码
else 签名无效
User->>User: 拒绝安装
end
Note over Developer,User: 数字签名应用流程
密钥管理
算法选对了,密钥管不好照样出事。这块我踩坑最多。
密钥生命周期
密钥生成:安全地生成密钥。
密钥分发:安全地分发密钥。
密钥存储:安全地存储密钥。
密钥销毁:安全地销毁密钥。
stateDiagram-v2
[*] --> 密钥生成
密钥生成 --> 密钥分发
密钥分发 --> 密钥使用
密钥使用 --> 密钥更新
密钥更新 --> 密钥使用
密钥使用 --> 密钥撤销
密钥撤销 --> 密钥销毁
密钥销毁 --> [*]
note right of 密钥使用
正常使用密钥
进行加密解密操作
end note
密钥交换协议
DH密钥交换:Diffie-Hellman密钥交换协议。
ECDH:基于椭圆曲线的密钥交换。
TLS握手:TLS协议中的密钥交换。
前向保密:保证前向保密性。
sequenceDiagram
participant Alice as Alice
participant Bob as Bob
Note over Alice,Bob: DH密钥交换
Alice->>Alice: 生成私钥a, 公钥A
Bob->>Bob: 生成私钥b, 公钥B
Alice->>Bob: 发送公钥A
Bob->>Alice: 发送公钥B
Alice->>Alice: 计算共享密钥 K = B^a mod p
Bob->>Bob: 计算共享密钥 K = A^b mod p
Note over Alice,Bob: 双方获得相同的共享密钥K
Alice->>Bob: 使用密钥K加密通信
Bob->>Alice: 使用密钥K解密通信
零知识证明
我补课的终点。能向验证者证明「某个命题成立」,同时不泄露证明过程里的额外信息。
零知识证明概念
证明:向验证者证明某个声明。
零知识:不泄露任何额外信息。
可靠性:证明必须是可靠的。
完整性:验证者能够验证证明。
graph TB
subgraph 零知识证明
A[证明者]
A --> B[验证者]
B --> C[证明结果]
end
subgraph 零知识特性
D[完整性]
E[可靠性]
F[零知识性]
end
A --> D
B --> E
C --> F
subgraph 应用场景
G[身份认证]
H[隐私保护]
I[区块链]
end
A --> G
B --> H
C --> I
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style B fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
ZK-SNARKs和ZK-STARKs
ZK-SNARKs:零知识简洁非交互式知识论证。
ZK-STARKs:零知识可扩展透明知识论证。
性能对比:两者在性能上的差异。
应用场景:在不同场景中的应用。
graph TB
subgraph 零知识证明技术
A[ZK-SNARKs]
B[ZK-STARKs]
end
subgraph 技术特性
C[证明大小小]
D[验证速度快]
E[抗量子攻击]
F[透明可信]
end
A --> C
A --> D
B --> E
B --> F
subgraph 计算开销
G[可信设置]
H[无需可信设置]
end
A --> G
B --> H
subgraph 应用
I[Zcash]
J[Ethereum]
end
A --> I
B --> J
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style B fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
密码学应用场景
下面几块是我实际项目里碰得最多的。
网络安全
SSL/TLS:保护网络通信安全。
VPN:虚拟专用网络安全。
SSH:安全远程登录。
HTTPS:安全的HTTP通信。
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
participant CA as 证书颁发机构
Note over Client,Server: TLS握手过程
Client->>Server: ClientHello
Server->>Client: ServerHello + 证书
Client->>CA: 验证证书
CA-->>Client: 证书有效
Client->>Client: 生成会话密钥
Client->>Server: 加密的会话密钥
Server->>Server: 解密会话密钥
Note over Client,Server: 建立安全通道
区块链
密码学哈希:区块链的核心技术。
数字签名:交易验证的基础。
公钥加密:钱包地址生成。
零知识证明:隐私保护交易。
graph TB
subgraph 区块链密码学应用
A[密码学哈希]
B[数字签名]
C[公钥加密]
D[零知识证明]
end
subgraph 应用功能
E[区块链接]
F[交易验证]
G[地址生成]
H[隐私保护]
end
A --> E
B --> F
C --> G
D --> H
subgraph 技术要求
I[抗碰撞性]
J[不可否认性]
K[安全性]
L[隐私性]
end
A --> I
B --> J
C --> K
D --> L
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
后量子密码学
RSA、ECC 迟早要面对量子计算的威胁。这块我还在跟进,先把框架记一下。
量子威胁
Shor算法:可破解RSA和ECC。
Grover算法:可加速哈希碰撞搜索。
量子计算:量子计算的发展威胁。
时间窗口:还有时间准备后量子密码学。
graph TB
subgraph 量子算法威胁
A[Shor算法]
B[Grover算法]
end
subgraph 受威胁技术
C[RSA]
D[ECC]
E[对称加密]
F[哈希函数]
end
A --> C
A --> D
B --> E
B --> F
subgraph 安全影响
G[破解速度]
H[密钥长度]
end
A --> G: 指数级加速
B --> H: 需要加倍长度
style A fill:#FFB6C1,stroke:#FF0000,stroke-width:1px
style C fill:#FFB6C1,stroke:#FF0000,stroke-width:1px
后量子算法
格基密码学:基于格问题的密码学。
编码密码学:基于纠错码的密码学。
多变量密码学:基于多变量方程的密码学。
哈希密码学:基于哈希函数的密码学。
graph TB
subgraph 后量子密码学
A[格基密码学]
B[编码密码学]
C[多变量密码学]
D[哈希密码学]
end
subgraph 代表算法
E[LWE]
F[McEliece]
G[Rainbow]
H[SPHINCS+]
end
A --> E
B --> F
C --> G
D --> H
subgraph 安全基础
I[格问题困难性]
J[纠错码问题]
K[多变量方程]
L[哈希函数]
end
A --> I
B --> J
C --> K
D --> L
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style D fill:#90EE90,stroke:#006400,stroke-width:1px
密码学最佳实践
几条血泪换来的规矩,比背概念管用。
使用原则
不要自己发明:使用经过验证的密码学算法。
使用标准库:使用标准密码学库。
密钥管理:妥善管理密钥。
定期更新:定期更新密码学算法和密钥。
graph TB
subgraph 密码学使用原则
A[不要自己发明]
B[使用标准库]
C[密钥管理]
D[定期更新]
end
subgraph 实施要点
E[使用成熟算法]
F[选择可信库]
G[安全存储密钥]
H[跟踪安全更新]
end
A --> E
B --> F
C --> G
D --> H
subgraph 风险防范
I[算法选择]
J[实现安全]
K[密钥保护]
L[漏洞修复]
end
A --> I
B --> J
C --> K
D --> L
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style C fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
常见错误
弱密钥:使用弱密钥或默认密钥。
算法误用:错误使用密码学算法。
密钥泄露:密钥管理不当导致泄露。
实现错误:密码学实现中的错误。
graph TB
subgraph 常见密码学错误
A[弱密钥]
B[算法误用]
C[密钥泄露]
D[实现错误]
end
subgraph 错误后果
E[容易被破解]
F[安全性降低]
G[数据泄露]
H[系统漏洞]
end
A --> E
B --> F
C --> G
D --> H
subgraph 预防措施
I[强密钥策略]
J[正确使用算法]
K[安全密钥管理]
L[代码审计]
end
A --> I
B --> J
C --> K
D --> L
style A fill:#FFB6C1,stroke:#FF0000,stroke-width:1px
style C fill:#FFB6C1,stroke:#FF0000,stroke-width:1px
未来发展趋势
同态加密、量子密钥分发这些方向,我目前只做到「知道有这玩意、别当不存在」的程度:
同态加密
隐私计算:在加密数据上直接计算。
云计算安全:云计算中的数据安全。
机器学习隐私:机器学习模型的隐私保护。
金融应用:金融数据的隐私处理。
graph TB
subgraph 同态加密特性
A[密文计算]
B[数据隐私]
C[云计算]
end
subgraph 加密类型
D[全同态加密]
E[部分同态加密]
end
A --> D
B --> E
subgraph 应用场景
F[隐私统计]
G[安全机器学习]
H[隐私数据分析]
end
A --> F
B --> G
C --> H
style A fill:#90EE90,stroke:#006400,stroke-width:1px
style D fill:#87CEEB,stroke:#1E90FF,stroke-width:1px
量子密码学
量子密钥分发:基于量子物理的密钥分发。
量子随机数:真正的量子随机数生成。
量子计算:量子计算对密码学的影响。
量子安全:量子时代的密码学安全。
sequenceDiagram
participant Alice as Alice
participant QuantumChannel as 量子信道
participant Bob as Bob
participant ClassicalChannel as 经典信道
Note over Alice,Bob: 量子密钥分发(QKD)
Alice->>QuantumChannel: 发送量子比特
QuantumChannel->>Bob: 接收量子比特
alt 窃听检测
Alice->>ClassicalChannel: 发送基信息
Bob->>ClassicalChannel: 发送测量结果
Alice->>Alice: 检测窃听
alt 检测到窃听
Alice->>Alice: 放弃密钥
Bob->>Bob: 放弃密钥
else 无窃听
Alice->>Alice: 提取密钥
Bob->>Bob: 提取密钥
end
end
Note over Alice,Bob: 量子密钥分发过程
结语
从对称加密补到零知识证明,我最大的体会是:概念可以后补,但「别自己发明算法、密钥管不好等于白加密」这两条得先刻脑子里。
ZK 那块我还在项目里摸索,这篇笔记会随踩坑继续改。如果你也在从传统加密往 ZK 跳,欢迎交流具体卡在哪一步。
可用性说明:本文发布于 2019 年 4 月,距今已超过五年。文中涉及的软件版本、接口、下载地址、命令参数和操作界面可能已经发生变化,部分方案在当前环境下可能失效。请结合官方最新文档核对后再操作,生产环境使用前务必先行验证。
版权声明: 本文首发于
指尖魔法屋-把对称加密换到零知识证明时踩过的坑(https://blog.thinkmoon.cn/post/47-crypto-zkp-zero-knowledge-practice/)
转载或引用必须申明原指尖魔法屋来源及源地址!