bwesterb/go-ristretto

GitHub: bwesterb/go-ristretto

纯 Go 实现的 Ristretto 素数阶群密码学库,基于 Edwards25519 曲线,为高级密码学方案提供安全的群运算基础。

Stars: 90 | Forks: 8

# go-ristretto 许多密码学方案需要一个素数阶群。流行且 高效的椭圆曲线(例如因 `ed25519` 而闻名的 Edwards25519)很 少是素数阶的。然而,有一种方便的方法可以从这类曲线中 构造一个素数阶群, 即由 [Mike Hamburg](https://www.shiftleft.org) 提出的 [Ristretto](https://ristretto.group)。 这是一个纯 Go 实现,用于在 由 Edwards25519 构建的 Ristretto 素数阶群上进行群运算。 文档可以在 [godoc](https://godoc.org/github.com/bwesterb/go-ristretto) 上找到。 ## 示例:El'Gamal 加密 ``` // Generate an El'Gamal keypair var secretKey ristretto.Scalar var publicKey ristretto.Point secretKey.Rand() // generate a new secret key publicKey.ScalarMultBase(&secretKey) // compute public key // El'Gamal encrypt a random curve point p into a ciphertext-pair (c1,c2) var p ristretto.Point var r ristretto.Scalar var c1 ristretto.Point var c2 ristretto.Point p.Rand() r.Rand() c2.ScalarMultBase(&r) c1.PublicScalarMult(&publicKey, &r) c1.Add(&c1, &p) // Decrypt (c1,c2) back to p var blinding, p2 ristretto.Point blinding.ScalarMult(&c2, &secretKey) p2.Sub(&c1, &blinding) fmt.Printf("%v", bytes.Equal(p.Bytes(), p2.Bytes())) // Output: // true ``` ## 与 `ristretto255` RFC 草案的兼容性 已经[提出了一项 RFC](https://datatracker.ietf.org/doc/draft-hdevalence-cfrg-ristretto/) 以标准化基于 Ed25519 的 Ristretto。此 RFC 与 `go-ristretto` 兼容。但 有一点需要注意:应该使用 `Point.DeriveDalek` 而不是 `Point.Derive` 来从字符串中派生点。 ## 参考文献 曲线和 Ristretto 的实现基于未发表的 [PandA](https://link.springer.com/chapter/10.1007/978-3-319-04873-4_14) 库,该库由 [Chuengsatiansup](https://perso.ens-lyon.fr/chitchanok.chuengsatiansup/)、 [Ribarski](http://panceribarski.com) 和 [Schwabe](https://cryptojedi.org/peter/index.shtml) 编写,参见 [cref/cref.c](cref/cref.c)。旧的通用 radix 25.5 域运算借鉴了 [Adam Langley](https://www.imperialviolet.org) 的 [ed25519](http://github.com/agl/ed25519)。 amd64 优化的域算术来自 George Tankersley 的 [ed25519 补丁](https://go-review.googlesource.com/c/crypto/+/71950), 而该补丁本身又基于 SUPERCOP 的 [`amd64-51-30k`](https://github.com/floodyberry/supercop/tree/master/crypto_sign/ed25519/amd64-51-30k), 由 Bernstein、Duif、Lange、Schwabe 和 Yang 编写。 新的通用 radix 51 域运算也基于 `amd64-51-30k`。 可变时间标量乘法代码基于 [curve25519-dalek](https://github.com/dalek-cryptography/curve25519-dalek) 的实现。 Lizard 编码由 [Bram Westerbaan](https://bram.westerbaan.name/) 提出。 与之相关的快速 RistrettoElligator 求逆是与 [Bram Westerbaan](https://bram.westerbaan.name/) 和 [Mike Hamburg](https://www.shiftleft.org) 共同完成的工作。 ### 其他平台 * [Rust](https://github.com/dalek-cryptography/curve25519-dalek) * [Javascript](https://github.com/jedisct1/wasm-crypto) * [C(`libsodium` 的一部分)](https://libsodium.gitbook.io/doc/advanced/point-arithmetic/ristretto) ## 更改日志 ### 1.2.3 (2023-03-16) - 当读取随机数失败时触发 panic。 ### 1.2.2 (2022-07-29) - 添加了 Point.ConditionalSet() 和 Scalar.ConditionalSet()。 ### 1.2.1 (2021-11-08) - 添加了 Scalar.SetUint64()。 ### 1.2.0 (2021-02-17) - 添加了 Point.Double()。参见 issue #21。 - 为了更紧密地贴合 RFC,Point.SetBytes() 和 Point.UnmarshalBinary() 现在将拒绝具有非规范编码的点。 参见 #20。 ### 1.1.1 (2019-09-24) - 仅在 Go 1.13 及以上版本中使用 bits.Add64,以确保我们在非 amd64 平台上保持常数时间。 感谢 @Yawning;参见 issue #17。 ### 1.1.0 (2019-05-13)
标签:EVTX分析, 日志审计