为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中签署curve25519密钥?

如何在golang中签署curve25519密钥?

Go
临摹微笑 2022-06-13 15:33:59
我正在尝试从 Signal in Go 中实现 X3DH 算法。但是,我在如何签署 Public Signed PreKey 上陷入了困境。根据规范,它应该是 X25519 密钥。在查看 Github 上的先前实现时,他们[32]byte从curve25519包中生成了一个密钥,然后将其转换为一个ed25519密钥,然后对其进行签名。但是,他们用于转换的包已被弃用 ( github.com/agl/ed25519)。因此,我要么需要能够将密钥转换为,ed25519以便我可以使用当前ed25519包 ( golang.org/x/crypto/25519) 对它们进行签名,要么实现curve25519密钥的签名和验证功能。
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

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 撰写的一篇很棒的博客,讨论了这个话题。


查看完整回答
反对 回复 2022-06-13
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

这需要一个公共的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”中的函数


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信