Ed25519的實現

2020-08-14 19:09:35

new SQRL authentication方案依賴於Daniel Bernstein開發的Curve Ed25519加密。但是,爲了開始實施該方案,首先需要成熟的Curve Ed25519實現。

有沒有人知道任何成熟的實現?對於Java,.NET或任何其他流行的平臺?

3 個答案:

答案 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進行金鑰交換。