繁体   English   中英

如何添加两个curve25519点

[英]How do I add two curve25519 points

我在curve25519上有两个点([32]字节)。 我如何添加它们(a + b)。 我显然不能使用 big.Int 来做到这一点,因为它们不是数字而是曲线上的点。 到目前为止,我还没有找到任何库来做类似于我可以使用edwards25519做的事情:

a := [32]byte // I get that from another function
b := [32]byte // also from another function
pointA, _ := new(edwards25519.Point).SetBytes(a)
pointB, _ := new(edwards25519.Point).SetBytes(b)
pointC := pointA.Add(pointA, pointB)

fmt.Println(pointC.Bytes())

我已经尝试使用它并使用&edwards25519.Point{}.BytesMontgomery()将结果转换为蒙哥马利曲线,但我无法将ab都导入 edwards25519 曲线,因为它们是曲线 25519 上的点。

您可以通过两个步骤使用libsodium来实现此目的。

  1. Edwards25519/Ed25519密钥开始,生成两个公钥/点,然后调用crypto_core_ed25519_add文档)。

  2. 通过双有理 map(文档)使用crypto_sign_ed25519_pk_to_curve25519将结果转换为curve25519

Go有绑定。 您需要小心,不要使用一些“随机”库,这些东西很难在恒定时间内正确且难以完成(避免侧通道)。

RFC 7748将公式提供给 map (x, y) Ed25519 Edwards指向(u, v) Curve25519 Montgomery点,反之亦然。

双有理图是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM