把对称加密换到零知识证明时踩过的坑

我没按教科书顺序学。先解决眼前的阻塞,再回头补原理。

项目里要用零知识证明做「证明我知道密钥,但不泄露密钥」这类需求时,我发现自己对对称加密还算熟,一到 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/) 转载或引用必须申明原指尖魔法屋来源及源地址!