登录
首页 >  Golang >  Go问答

如何添加两个 curve25519 点

来源:stackoverflow

时间:2024-04-18 09:36:37 388浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《如何添加两个 curve25519 点》,聊聊,我们一起来看看吧!

问题内容

我在 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 (documentation)。

  2. 通过双有理映射 (documentation) 使用 crypto_sign_ed25519_pk_to_curve25519 将结果转换为 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))

今天关于《如何添加两个 curve25519 点》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>