MiMC(Minimal Multiplicative Complexity)
问题:传统密码(如 AES、SHA-256)在标准计算机上很快,但在 MPC/FHE/ZK 等场景中,非线性乘法操作是性能瓶颈,而线性操作(如 XOR)几乎"免费"。
方案:轮函数 = (x ⊕ k ⊕ c)³
即:状态与密钥、轮常数异或后,直接在有限域上做立方运算。通过迭代足够多的轮数,构建出安全的块密码、置换和哈希函数。
| 指标 | MiMC | SHA-256 | LowMC | Keccak |
|---|---|---|---|---|
| 处理单块时间 | ~7.8 ms | ~73 ms | ~90 ms | ~271 ms |
| 约束生成 | 6.3 ms | - | 13.5 ms | 9.2 ms |
| 见证生成 | 1.5 ms | - | 76.8 ms | 262 ms |
| 乘法次数 | 1293 | 29000 | 9408 | 3300 |
| Rank-1 约束 | 646 | - | 4704 | 2200 |
-
MiMC 比 SHA-256 快约 10 倍,比 LowMC 也快一个数量级
-
原因是:虽然 LowMC 的 AND 门数更少,但其海量 XOR 操作在 SNARK 中累积成巨大开销;而 MiMC 每轮只有 1 次加法和 1 次乘法,结构极简。
-
先确定有限域大小 p
- Groth16 + BN254 → 标量域约 254 bit
- Plonk/Halo2 + BLS12-381 → 标量域约 255 bit
-
检查置换条件
需要 gcd(3, p-1) = 1,也就是 x³ 在这个域上必须是双射(permutation)。
很多常见 SNARK 曲线(比如 BN254)的 p-1 恰好能被 3 整除,这时候 x³ 根本不是置换,必须换成别的指数(比如 5、7)。
-
套用论文的轮数公式,再留安全余量
$$r = \left\lceil \frac{\log_2 d}{\log_2 p} \right\rceil + \text{security margin}$$