有哪些Ed25519的实现?

时间:2013-10-02 22:06:17

标签: cryptography curve-25519 sqrl ed25519

new SQRL authentication方案依赖于Daniel Bernstein开发的Curve Ed25519加密。但是,为了开始实施该方案,首先需要成熟的Curve Ed25519实现。

有没有人知道任何成熟的实现?对于Java,.NET或任何其他流行的平台?

4 个答案:

答案 0 :(得分:33)

Curve25519 vs. Ed25519

首先,Curve25519和Ed25519并不完全相同。它们基于相同的基础曲线,但使用不同的表示。大多数实现都是针对Curve25519或Ed25519,但可以在它们之间重用一些代码。

可以将Ed25519公钥转换为Curve25519,但反过来却错过了一个符号位。即,两个Ed25519公钥对应于单个Curve25519公钥。私钥也很相似。


关于实现,区分实际实现和以可用形式打包它们的库是很重要的。

实际实施

djb在SUPERCOP

中的实施
    用li写的
  • Ref,很慢
  • djb的Ref10用c写的,体面的表现
  • djb的amd64-64-24kamd64-51-30k,用汇编语言编写,大约是Ref10
  • 的两倍

他还在NaCl中编写了一个早期的,不兼容的原型,不要使用那个

Floodyberry's donna实施

包含几个变体,包括程序集和c。一些针对64位进行了优化,一些针对32位进行了优化。

  • LibSodium

    C库,目前使用Ref10实现

    bindings for many programming languages。它可能是最受欢迎的版本,也是我向大多数人推荐的版本。

    包含一系列来自NaCl的其他加密函数,例如经过身份验证的加密(XSalsa20Poly1305),哈希,Curve25519密钥交换。

  • Nightcracker's Ed25519

    C库,使用Ref10实现。

    该库最有趣的功能是它支持使用Ed25519公钥进行密钥交换。但它不会散列共享密钥,因此它不会产生与Curve25519相同的共享密钥。

    包含Win32和Win64的预构建二进制文件。

  • 我的C# port

    纯托管代码,在32位和64位平台上保持不变。基于Ref10。比c实现慢一点,但差别非常小。

    使用Curve25519和Ed25519键支持与NaCl兼容的密钥交换,并包含一系列来自NaCl的其他加密函数。我的目标是设置与LibSodium类似的功能。

    Ed25519签名功能起作用并且已经进行了大量的测试,但是库的其他部分有点粗糙。

  • 直接使用SUPERCOP或Floodyberry代码的实现。

    可能需要更多的工作来构建,但是你会获得更高的性能(~2x)并且不需要携带你不需要的代码。


我建议现在就去LibSodium。它相对受欢迎且维护良好。性能不错,只会导致真正标志性的重型应用程序出现性能问题。

答案 1 :(得分:6)

添加到CodesInChaos的回答:

  • 我的Java port

    基于Ref 10,并提供标准的JCA API,以便将其添加到加密提供程序。

答案 2 :(得分:2)

到目前为止,最成熟和最高效的是丹尼尔伯恩斯坦本人写的。它可以在SUPERCOP内找到。

然而,它的API非常笨拙,需要相当多的挖掘/提取来获得你想要的东西。为了节省其他人的工作,我自己完成了这项工作并将我的代码放在Github上。

请注意您的确切条款,Ed25519和Curve25519是相关的,但不同的东西。你应该知道的是Ed25519是一个公钥/私钥签名系统,Curve25519是一个密钥交换。 Ed25519密钥对可以转换为Curve25519密钥对,反过来我不太确定。我在Github上的图书馆所做的就是将所有内容保存在Ed25519密钥对中,然后转换为Curve25519进行密钥交换。

答案 3 :(得分:0)

Go 1.17 (Q3 2021) 将带有 new and faster implementation, done by Filo Sottile

golang commit b0c49ae

<块引用>

此更改取代了 crypto/ed25519/internal/edwards25519 package 使用 filippo.io/edwards25519 中的代码,速度更快、更安全, 测试良好(超过 1600 行新测试,99% 的测试覆盖率),以及 更好地记录(600 行新评论)实施。

一些亮点:

  • 针对 64 位优化的不饱和 51 位肢体字段实现 架构和 math/bits.Mul64 内在函数
  • 使用多宽度更有效的可变时间标量乘法 具有更大的固定基数查找表的非相邻形式
  • 用于标量、点和字段的安全数学/big.Int 类 API。 具有完全抽象化约不变量的类型
  • 一个测试套件,包括一个用于探索边缘情况的测试/快速模糊器 不可能随机命中的值和系统测试 用于参数和接收器别名
  • 严格匹配原始逻辑的点解码规则 crypto/ed25519/internal/edwards25519,以避免共识问题
  • 适用于 arm64 和 amd64 的符合 AssemblyPolicy 的装配核心, 前者不到20行,后者基于程序生成 github.com/mmcloughlin/avo 可以逐行审查 通用实现