Erlang代码(aec_hashkey_sign.erl)是合理的概念演示,但不是生产级完整实现,有多个需要改动/完善的地方:
•WinternitzOTS部分严重简化
(winternitz_public key/1、 winternitz sign/2、winternitzverify/1用了模拟crypto:hash和随机字节),实际必须用完整Winternitz参数(w=16,checksum等),否则不安全。建议直接集成现有erlang-Ims库的完整OTS实现。
• Merkle树构建(generate_ots_seeds、merkle_root、build auth_path、merkle verify)简化了配对和路径计算,实际需严格按RFC8554递归构建,避免索引错误。
签名格式(sign/2返回<<Header,OTSSig,AuthPath>>)基本符合,但字节大小标注2132是H10
参数,需确认实际byte_size。
·缺少私钥持久化(有状态!必须记录leafidx,丢失状态会导致密钥复用→不安全)。
•缺少参数多样性(只硬编码H10,应支持H5/H10/H15/H20)。
•测试函数test/0可运行通过,但因简化,实际验证不代表真实安全。
•集成路径(修改aec keys.erl、aec signatures.erl等)
方向正确,但需处理向后兼容(旧地址仍用Ed25519,新hk地址用LMS),以及gas费用调整
(签名大,费用会高)。
总体:代码可作为POC起点,本地能跑demo,但距主网部署还需完整库集成、安全审计、测试网验证。不能直接上线。
LMS代码替代方案:使用SPHINCS+(NIST标准化SLH-DSA,无状态哈希基签名,真正“一劳永逸”抗量子,仅依赖SHA-256/SHAKE,无状态管理问题,签名大小类似~16KB,但安全且无需状态)。
Erlang有现成NIF库pqclean
( GitHub - potatosalad/erlang-pqclean: Post-Quantum Cryptography NIF based on PQClean for Erlang and Elixir )
支持多种SPHINCS+变体(推荐sphincs shake256f robust,安全级别高,签名~16KB)_。
以上是优化后的完整Erlang模块示例:
aec.sphincs sign.erl(新模块,直接集成pqclean nif,支持新地址类型“sp”前缀,量子免疫,无状态)。
需正式审计和测试网上线。
这个代码是生产级起点(依赖成熟pqclean库),直接可编译测试(rebar3 shell下test()输出SUCCESS和地址)比原LMS简化代码更安全、更现实、无状态风险。