350行Python实现生产级ML-DSA验证

350行Python实现生产级ML-DSA验证 图片 1
350行Python实现生产级ML-DSA验证 图片 2

我最近生活中不怎么用Python。1不过,我刚刚写了一个纯Python生产的ML-DSA验证器.是350行代码(还有更多测试),它支持所有参数集,我对它相当满意。

你可以这样取mldsa摘自PyPI,感谢威廉·伍德拉夫或者你可以复制粘贴:这是一个没有依赖的单一文件,是双重许可的CC0和0BSD。它支持Python 3.8及更高版本。

API的设计灵感来源于优秀的PYCA/密码学.

import mldsa

vk = mldsa.VerificationKey(verification_key_bytes)

try:
    vk.verify(signature, message)
except mldsa.VerificationError:
    print("invalid signature!")

我希望这能让一些项目更容易迁移到后量子认证,因为突然变得比我们预想的更紧迫.特别是,我希望它能解除一些因移植性原因无法使用 C 扩展的客户端应用。

现代派森包管理,打字, 和绒毛而且也更强大2比早期的 Python 3 天,结果是一个相当易读的 ML-DSA 验证器。

ML-DSA实际上非常简单,基字段为23位:我们用Python整数(甚至不需要Python强大的整数支持)和hashlib的SHA-3。有86条清嗓线,27条基场(算术,centered_mod,decompose),28行采样(sample_ntt,sample_in_ball),多项式的39个(Poly,NTTPolyNTT 25 次,解析和打包 30 次(pack,unpack,unpack_signed),35 的密钥展开(VerificationKey.__init__,public_key_hash),以及实际签名验证的80(VerificationKey.verify,message_hash,use_hint).

表演是......还不错?每秒230次ML-DSA-44验证,无需预计算。这比 Go 慢了 60 倍,但不是 1000 倍。我唯一做的优化改动是在NTT热环中使用整数而非场元素.

                             │   sec/op    │
Verify/ML-DSA-44/Whole         4.296m ± 2%
Verify/ML-DSA-65/Whole         6.509m ± 1%
Verify/ML-DSA-87/Whole         9.885m ± 3%
Verify/ML-DSA-44/Precomputed   2.635m ± 3%
Verify/ML-DSA-65/Precomputed   3.712m ± 4%
Verify/ML-DSA-87/Precomputed   5.363m ± 1%

实现采用完整的可重用ML-DSA测试栈进行测试:Wycheproof测试载体以及闭路电视累积向量,使用 pytest 和穆祖用于突变测试。它拥有96%的分支覆盖率,更重要的是它能消灭我(和克劳德)能想到的所有突变。

(ML-DSA测试技术值得单独写一篇文章。)

为什么选择Python?

该项目最初是为了再次核对测试结果测试赛关于我的 Go 加密/MLDSA 实现。你怎么知道你的测试是好且全面的?你加入漏洞(“突变”),然后检查测试是否失败。

但如果你跳过了支票呢?不会有任何代码来引入漏洞!该显而易见解决方案是从头写一个不同的实现,然后在那里引入漏洞,检查测试是否发现了漏洞,然后再把测试移植回去。

废话。

无论如何,纯Python可能不太适合涉及秘密的密码学,因为生成常时代码可能很困难。然而,一个签名验证器没有涉及秘密,Python表达力强,最重要的是,它与Go不同,减少了共享错误的可能性。

你可能想关注我的Bluesky页面@filippo.abyssdomain.expert或在乳齿象上@filippo@abyssdomain专家但我不能保证再用Python了。

图片

该琴托帕西并非全是平稳的骑行,这也是重点之一。不过,我确实是有点我对当地人很不满,他说这条路封闭了,但骑摩托车完全可以通行。

我的工作得以实现地狱一个由专业围棋维护者组成的组织,资金来源为艾娃实验室,传送,数据狗,尾鳞, 和哨兵.通过我们的委托合同,他们确保了开源维护工作的可持续性和可靠性,并直接联系到我和其他Geomys维护者的专业知识。

(了解更多内容请参见Geomys公告.)以下是其中几句话!

Teleport——过去五年,攻击和攻破事件正从传统的恶意软件和安全泄露转向通过社交工程学、凭证盗窃或钓鱼攻击识别和泄露有效用户账户和凭证。

传送身份旨在通过访问监控消除弱访问模式,减少访问请求的攻击面,并通过强制访问审查清除未使用的权限。

Ava Labs — 我们艾娃实验室,维护者雪崩GO(与雪崩网络),认为开源加密协议的可持续维护和发展对于区块链技术的广泛采用至关重要。

我们自豪地通过持续赞助菲利波及其团队,支持这项必要且有影响力的工作。

  1. 有趣的是,我最初是作为YouTube-dl的维护者开始涉足开源的。↩
  2. 我对TypeScript生态系统也有同样的感觉。偶尔玩一两周还挺有趣的,但我不想每天开车玩这些生态系统:很容易花一整天更新开发依赖和修复 linter 错误,产生了完成任务的错误。↩
添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论