24

新的 SQRL 身份验证方案依赖于 Daniel Bernstein 开发的 Curve Ed25519加密。然而,为了开始实施这个方案,首先需要一个成熟的 Curve Ed25519 实施。

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

4

5 回答 5

37

Curve25519 与 Ed25519

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

可以将 Ed25519 公钥转换为 Curve25519,但反过来会丢失一个符号位。即两个 Ed25519 公钥对应一个 Curve25519 公钥。私钥也非常相似。


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

实际实现

djb 在SUPERCOP中的实现

  • Ref用c写的,很慢
  • djbRef10用 c 编写,表现不错
  • djb 的amd64-64-24kand amd64-51-30k,用汇编语言编写,速度大约是 djb 的两倍Ref10

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

Floodyberry 的 donna实现

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

图书馆

  • Lib钠

    C 库,当前使用Ref10实现

    具有多种编程语言的绑定。它可能是最受欢迎的版本,也是我向大多数人推荐的版本。

    包含来自 NaCl 的许多其他加密功能,例如经过身份验证的加密 (XSalsa20Poly1305)、哈希、Curve25519 密钥交换。

  • 夜莺的 Ed25519

    C 库,使用Ref10实现。

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

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

  • 我的C# 端口

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

    支持使用 Curve25519 和 Ed25519 密钥与 NaCl 兼容的密钥交换,并包含来自 NaCl 的许多其他加密功能。我的目标是与 LibSodium 类似的功能集。

    Ed25519 签名函数可以工作并且已经进行了合理数量的测试,但是库的其他部分有点粗糙。

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

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


我建议现在使用 LibSodium。它比较受欢迎并且维护得很好。性能不错,应该只会在真正签名繁重的应用程序中引起性能问题。

于 2013-10-03T14:35:39.397 回答
6

添加到 CodesInChaos 的答案:

图书馆

  • 我的Java 端口

    基于 Ref 10,并提供标准 JCA API,因此可以将其添加到加密提供者。

于 2014-07-10T10:59:50.873 回答
2

到目前为止,最成熟和最有表现力的是丹尼尔伯恩斯坦自己写的。它可以在SUPERCOP中找到。

然而,它的 API 相当笨拙,需要相当多的挖掘/提取才能得到你想要的。为了节省其他人的工作,我自己做了这个并将我的代码放在Github上。

请注意您的确切术语,Ed25519 和 Curve25519 是相关的,但不同的东西。你应该知道的是 Ed25519 是一个公钥/私钥签名系统,而 Curve25519 是一个密钥交换。Ed25519 密钥对可以转换为 Curve25519 密钥对,反之我不太确定。我在 Github 上的库所做的是将所有内容保存在 Ed25519 密钥对中并转换为 Curve25519 以进行密钥交换。

于 2013-10-02T22:10:41.667 回答
0

Go 1.17(2021 年第三季度)将带来一个新的更快的实现,由Filo Sottile完成。

请参阅golang 提交 b0c49ae

此更改将crypto/ed25519/internal/edwards25519替换 为来自 的代码filippo.io/edwards25519,这是一个明显更快、更安全、经过良好测试(超过 1600 行新测试,99% 测试覆盖率)和更好记录(600 行新评论)的实现。

一些亮点:

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

嵌入式实现

于 2015-10-09T15:43:29.750 回答