hlouiso/blind_MSS

GitHub: hlouiso/blind_MSS

基于 ZKBoo 零知识证明和 XMSS/WOTS+ 后量子签名方案实现的 C 语言盲签名协议原型,用于研究和验证对称原语上的隐私保护签名构造。

Stars: 1 | Forks: 1

# 盲 XMSS(目标和 WOTS+)与 ZKBoo(MPC-in-the-Head) 本项目在 **XMSS**(一种有状态的 Merkle 签名方案)上实现了一种**盲签名**,其叶子节点使用**目标和 WOTS+** 一次性签名,并采用 **ZKBoo / MPC-in-the-head** 风格的 ZK 证明,以证明其知道有效签名**但不泄露**任何秘密材料(承诺开启值、叶子索引或签名本身)。 它是基于 ZKBoo 对通用哈希盲签名构造的具体实例化:包含一个承诺方案、一个基于哈希的签名方案和一个 NIZK。这里的承诺方案是 **基于 GF(2¹²⁸) 的 Halevi–Micali**,签名方案是目标和 WOTS+/XMSS,而 NIZK 则是 ZKBoo。 ## 背景 这项工作是在我在[波尔多大学](https://mastercsi.labri.fr/)攻读**密码学与计算机安全**硕士学位的最后实习期间完成的。实习于 2025 年上半年在[UPC(巴塞罗那)](https://www.upc.edu/ca)进行,由 [Javier Herranz Sotoca](https://web.mat.upc.edu/javier.herranz/) 指导。 ## 构建 依赖要求: - 一个支持 OpenMP 的 C 编译器(GCC/Clang) - OpenSSL **libcrypto** - `make` ``` make # build everything make clean # remove binaries and intermediates ``` 生成的可执行文件:`CLIENT_blinding_message`、`SIGNER_XMSS_keygen`、`SIGNER_XMSS_sign`、`CLIENT_blind_sign`、`VERIFIER_verify`。 ## 参数 签名方案(`xmss.h`),与 Longfellow/Binius64 实例化保持一致: - `XMSS_H = 10` — Merkle 树高度(每对密钥可产生 `2^10 = 1024` 个签名) - `XMSS_WOTS_W = 4` — Winternitz 参数(2位坐标) - `XMSS_WOTS_LEN = 72` — WOTS+ 链的数量(目标和编码,无校验和) - `XMSS_TARGET_SUM = 132` — 72 个坐标所需满足的总和 - `XMSS_NODE_BYTES = 16` — 每个内部节点是 SHA-256 输出截断至 128 位的结果 - `XMSS_PK_SEED_BYTES = 16`,`XMSS_NONCE_LEN = 6` - 所有哈希均使用 SHA-256,采用 SPHINCS+ 风格的密钥化/微调(微调 `0x00` 链,`0x01` 树/pk,`0x02` 消息)。 Halevi–Micali 承诺(`commitment.h`): - `HM_NONCES = 6`,`HM_LINES = 2`,域 `GF(2¹²⁸)` — 与基于 Longfellow 的实例化布局相同。 - 开启值 `(r, a)` 为 `96 + 192 = 288` 字节;承诺 `com = a‖b‖y` 为 `256` 字节。 ZKBoo(`shared.c`): - `NUM_ROUNDS = 137` 次并行执行(可靠性误差 `(2/3)^137`);若要达到 `2^-128`,请将其提升至 `219`。 - `INPUT_LEN = 1610`,`ySize = 191448`(每个视图的非线性门转录字)。 ## 文件与格式 所有十六进制数据均为**大写**且不含空格。 - **`XMSS_secret_key.txt`**(`SIGNER_XMSS_keygen`) - 第 1 行:`sk_seed` — 32 字节(64 个十六进制字符) - 第 2 行:`pk_seed` — 16 字节(32 个十六进制字符) - 第 3 行:`leaf_index` — 十进制(初始值为 `0`) - **`XMSS_public_key.txt`**(`SIGNER_XMSS_keygen`) - 第 1 行:`pk_seed` — 16 字节(32 个十六进制字符) - 第 2 行:XMSS root — 16 字节(32 个十六进制字符) - **`blinding_key.txt`**(`CLIENT_blinding_message`) — 秘密开启值 `(r, a)` - 第 1 行:nonces `r₁‖…‖r₆` — 96 字节(192 个十六进制字符) - 第 2 行:行矩阵 `a`(行优先 `a_{0,0..5} ‖ a_{1,0..5}`) — 192 字节(384 个十六进制字符) - **`blinded_message.txt`**(`CLIENT_blinding_message`) - 承诺 `com = a ‖ b ‖ y` — 256 字节(512 个十六进制字符)。签名者由此派生 `d = SHA256(com)`。 - **`XMSS_signature.txt`**(`SIGNER_XMSS_sign`) - 第 1 行:`leaf_index` — 十进制 - 第 2 行:`nonce` — 6 字节(12 个十六进制字符) - 接下来 `72` 行:WOTS+ 链值 — 每行 16 字节(32 个十六进制字符) - 接下来 `10` 行:XMSS 认证路径 — 每行 16 字节(32 个十六进制字符) - **`signature_proof.bin`**(`CLIENT_blind_sign`) - 二进制 ZKBoo 证明,证明在被承诺的消息上存在有效的 XMSS 签名。 ## 典型工作流 1. **签名者**生成密钥:`./SIGNER_XMSS_keygen` → `XMSS_secret_key.txt`、`XMSS_public_key.txt`。 2. **客户端**盲化消息:`./CLIENT_blinding_message`(提示输入 `m`) → `blinding_key.txt`(秘密开启值 `(r, a)`),`blinded_message.txt`(承诺 `com = a‖b‖y`)。客户端将 `(r, a)` 保密,并将 `com` 发送给签名者。 3. **签名者**对承诺进行签名:`./SIGNER_XMSS_sign`(读取 `XMSS_secret_key.txt`、`blinded_message.txt`;派生 `d = SHA256(com)`,对 `d` 进行签名,并使用公钥进行自检) → `XMSS_signature.txt`,并推进叶子索引。 4. **客户端**生成证明:`./CLIENT_blind_sign`(提示输入 `m`;读取 `blinding_key.txt`、`XMSS_signature.txt`、`XMSS_public_key.txt`)。它首先重新检查 XMSS 签名对于 `d = SHA256(a‖b‖y)` 是否有效,然后将 ZK 证明写入 `signature_proof.bin`。 5. **验证者**进行验证:`./VERIFIER_verify`(提示输入 `m`;读取 `XMSS_public_key.txt`、`signature_proof.bin`)。 ## 性能 消息长度仅影响原生的 `m̂ = SHA256(m)`,因此证明/验证时间与 `|m|` 无关。 ### 产物大小 | 产物 | 大小 | |---|---:| | 公钥(`pk_seed ‖ root`) | $32$ B | | 私钥(`sk_seed ‖ pk_seed ‖ leaf_index`) | $52$ B | | 承诺 `com = a ‖ b ‖ y` | $256$ B | | 原始 XMSS 签名(`leaf ‖ nonce ‖ 72 chains ‖ 10 path`) | $1.29$ KB | | **盲签名(ZKBoo 证明)** | $\approx 168.5$ MB | ### 耗时 | 阶段 | 平均时间 | |---|---:| | 承诺计算 | $< 1$ ms | | 密钥生成 | $\approx 130$ ms | | 签名 | $\approx 130$ ms | | 证明生成 | $\approx 1.7$ s | | 证明验证 | $\approx 0.9$ s | 由于 ZKBoo 的固有特性,证明体积非常庞大:`NUM_ROUNDS` 轮中的每一轮 都会序列化一份完整的逐视图非线性门转录,因此 ``` proof ≈ NUM_ROUNDS · (ySize·4 + 2·INPUT_LEN + sizeof(a) + 128) = 219 · (765792 + 3220 + 192 + 128) ≈ 168.5 MB ``` ## 参考文献 - [ZKBoo:更快的布尔电路零知识证明 — ePrint 2016/163](https://eprint.iacr.org/2016/163) - [基于对称密钥原语的后量子零知识与签名 — ePrint 2017/279](https://eprint.iacr.org/2017/279.pdf) - [原始 ZKBoo 实现(奥胡斯大学)](https://github.com/Sobuno/ZKBoo) - [XMSS — RFC 8391](https://datatracker.ietf.org/doc/html/rfc8391)
标签:后量子密码学, 哈希签名, 客户端加密, 密码学, 手动系统调用, 盲签名, 零知识证明