如何在golang中签署curve25519密钥?

我正在尝试从 Signal in Go 中实现 X3DH 算法。但是,我在如何签署 Public Signed PreKey 上陷入了困境。

根据规范,它应该是 X25519 密钥。在查看 Github 上的先前实现时,他们[32]bytecurve25519包中生成了一个密钥,然后将其转换为一个ed25519密钥,然后对其进行签名。

但是,他们用于转换的包已被弃用 ( github.com/agl/ed25519)。因此,我要么需要能够将密钥转换为,ed25519以便我可以使用当前ed25519包 ( golang.org/x/crypto/25519) 对它们进行签名,要么实现curve25519密钥的签名和验证功能。


临摹微笑
浏览 258回答 2
2回答

12345678_0001

Ed25519键可以X25519很容易地转换为键,使用的扭曲爱德华兹曲线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.  Inparticular, convert Curve25519's "montgomery" x-coordinate into anEd25519 "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-expThen move the sign bit into the pubkey from the signature.*/var edY, one, montX, montXMinusOne, montXPlusOne FieldElementFeFromBytes(&montX, &publicKey)FeOne(&one)FeSub(&montXMinusOne, &montX, &one)FeAdd(&montXPlusOne, &montX, &one)FeInvert(&montXPlusOne, &montXPlusOne)FeMul(&edY, &montXMinusOne, &montXPlusOne)var A_ed [32]byteFeToBytes(&A_ed, &edY)A_ed[31] |= signature[63] & 0x80signature[63] &= 0x7Fvar 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”中的函数
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go