new SQRL authentication方案依賴於Daniel Bernstein開發的Curve Ed25519加密。但是,爲了開始實施該方案,首先需要成熟的Curve Ed25519實現。
有沒有人知道任何成熟的實現?對於Java,.NET或任何其他流行的平臺?
3 個答案:
答案 0 :(得分:33)
首先,Curve25519和Ed25519並不完全相同。它們基於相同的基礎曲線,但使用不同的表示。大多數實現都是針對Curve25519或Ed25519,但可以在它們之間重用一些程式碼。
可以將Ed25519公鑰轉換爲Curve25519,但反過來卻錯過了一個符號位。即,兩個Ed25519公鑰對應於單個Curve25519公鑰。私鑰也很相似。
關於實現,區分實際實現和以可用形式打包它們的庫是很重要的。
djb在SUPERCOP
中的實施
Ref
,很慢Ref10
用c寫的,體面的表現amd64-64-24k
和amd64-51-30k
,用匯編語言編寫,大約是Ref10
他還在NaCl中編寫了一個早期的,不相容的原型,不要使用那個
包含幾個變體,包括程式集和c。一些針對64位元進行了優化,一些針對32位元進行了優化。
C庫,目前使用Ref10
實現
有bindings for many programming languages。它可能是最受歡迎的版本,也是我向大多數人推薦的版本。
包含一系列來自NaCl的其他加密函數,例如經過身份驗證的加密(XSalsa20Poly1305),雜湊,Curve25519金鑰交換。
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的回答:
基於Ref 10,並提供標準的JCA API,以便將其新增到加密提供程式。
答案 2 :(得分:2)
到目前爲止,最成熟和最高效的是丹尼爾伯恩斯坦本人寫的。它可以在SUPERCOP內找到。
然而,它的API非常笨拙,需要相當多的挖掘/提取來獲得你想要的東西。爲了節省其他人的工作,我自己完成了這項工作並將我的程式碼放在Github上。
請注意您的確切條款,Ed25519和Curve25519是相關的,但不同的東西。你應該知道的是Ed25519是一個公鑰/私鑰簽名系統,Curve25519是一個金鑰交換。 Ed25519金鑰對可以轉換爲Curve25519金鑰對,反過來我不太確定。我在Github上的圖書館所做的就是將所有內容儲存在Ed25519金鑰對中,然後轉換爲Curve25519進行金鑰交換。