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分析, 日志审计