簡體   English   中英

如何在golang中簽署curve25519密鑰?

[英]How do I sign a curve25519 key in golang?

我正在嘗試從 Go 中的 Signal 實現 X3DH 算法。 但是,我在如何簽署 Public Signed PreKey 上陷入了困境。

根據規范,它應該是 X25519 密鑰。 在查看 Github 上的先前實現時,他們從curve25519 package 生成了一個[32]byte密鑰,然后將其轉換為ed25519密鑰,然后對其進行簽名。

但是,他們用於轉換的軟件包已被棄用( github.com/agl/ed25519 )。 因此,我需要能夠將密鑰轉換為ed25519以便我可以使用當前的ed25519 package ( golang.org/x/crypto/25519 ) 對它們進行簽名,或者對密鑰實施簽名並驗證curve25519

Ed25519鍵可以輕松轉換為X25519鍵,Ed25519 使用的扭曲愛德華茲曲線和Ed25519使用的蒙哥馬利曲線是X25519 birationally等價的。

愛德華茲曲線上的點通常稱為 ( x, y ),而蒙哥馬利曲線上的點通常稱為 ( u, v )。

您不需要庫來進行轉換,它真的很簡單......

(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)
(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))

這是 Google 的 Golang 安全主管 Filippo Valsorda 撰寫的一篇很棒的博客,討論了這個話題。

這需要一個公共的curve25519 密鑰並將其轉換為一個ed25519 的公共密鑰。 我沒有編寫此代碼,但似乎正在做上面伍德斯托克所說的事情。 歡迎提供更多信息:

func Verify(publicKey [32]byte, message []byte, signature *[64]byte) bool {

publicKey[31] &= 0x7F

/* Convert the Curve25519 public key into an Ed25519 public key.  In
particular, convert Curve25519's "montgomery" x-coordinate into an
Ed25519 "edwards" y-coordinate:
ed_y = (mont_x - 1) / (mont_x + 1)
NOTE: mont_x=-1 is converted to ed_y=0 since fe_invert is mod-exp
Then move the sign bit into the pubkey from the signature.
*/

var edY, one, montX, montXMinusOne, montXPlusOne FieldElement
FeFromBytes(&montX, &publicKey)
FeOne(&one)
FeSub(&montXMinusOne, &montX, &one)
FeAdd(&montXPlusOne, &montX, &one)
FeInvert(&montXPlusOne, &montXPlusOne)
FeMul(&edY, &montXMinusOne, &montXPlusOne)

var A_ed [32]byte
FeToBytes(&A_ed, &edY)

A_ed[31] |= signature[63] & 0x80
signature[63] &= 0x7F

var sig = make([]byte, 64)
var aed = make([]byte, 32)

copy(sig, signature[:])
copy(aed, A_ed[:])

return ed25519.Verify(aed, message, sig)

這使用“golang.org/x/crypto/ed25519/internal”中的函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM