0

我在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(),但我既不能导入也a不能b导入 edwards25519 曲线,因为它们是曲线 25519 上的点。

4

1 回答 1

2

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

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

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

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

RFC 7748提供了将(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))
于 2021-02-24T11:53:00.353 回答