一种广泛的简化技巧

这是一篇关于密码学工程的文章,主要内容如下:

  • ECC 实现结构:椭圆曲线密码学实现大致包含基域实现、群逻辑、标量域实现和高层协议(密钥交换、签名等)。基域是模大素数的数集,实现了域内的算术运算等;群是椭圆曲线上的点集,通过点加法公式定义;标量域也是模大素数的数集,其实现与基域实现不同,某些高层协议对其操作有特定需求。
  • fiat-crypto:字段实现中隐藏着一些微妙而可怕的错误,fiat-crypto 项目使用形式化方法证明字段算术运算逻辑的正确性,并生成各种语言的代码来实现这些操作,作者用它替换了 Go 标准库中的 NIST 曲线基域实现。
  • “圣诞树”:大多数 edwards25519 实现使用相同的标量实现,其中一个函数包含大量硬编码整数常量,被称为“圣诞树”。
  • 宽缩减:标量值可能高于标量域阶,而字段实现只能接受低于阶的值,作者请求 fiat-crypto 作者添加宽缩减函数,Frank Denis 提出将值表示为 a + b 2^192 + c 2^384 的形式进行处理,通过这种方式删除了 ref10 标量实现的最后一部分代码。
  • 图片:作者在美丽的湖边删除代码,配图为夜晚湖边的景象。
  • 脚注说明

    • 解释了开始时说“quick”的原因
    • 忽略了标量域阶的余因子
    • 提及可以利用字段实现内部知识制作模糊器来生成可能触发边缘情况的输入
    • 说明了 SUPERCOP 实现的相关问题及使用 Frank Denis 的非官方仓库
    • 指出 Curve25519 基域也存在类似问题及 Go 中的处理方式
阅读 231
0 条评论