18个发布版本
0.8.18 | 2024年7月11日 |
---|---|
0.8.17 | 2024年6月6日 |
0.8.16 | 2024年2月26日 |
0.8.14 | 2024年1月31日 |
0.8.4 | 2023年5月31日 |
#417 in 密码学
1,700 每月下载量
在 3 crates 中使用
400KB
11K SLoC
blstrs
BLS12-381对友好椭圆曲线构造的实现,使用blst库作为后端。提供与
bls12_381_plus
的兼容性,除了哈希到曲线之外。blst
不提供通用的哈希到曲线实现,只支持SHA-256。
发音
最重要的部分,该名称发音为blasters
。
支持的平台
由于blst_plus
实现的汇编特性,目前只支持以下架构
x86_64
,aarch64
.
BLST可移植性
要在构建blst依赖项时启用可移植功能,请使用'portable'功能:--features portable
。
基准测试
$ cargo bench --features __private_bench
BLS12参数化
BLS12曲线由一个值x参数化,使得基域模数q和子群r可以通过以下方式计算
- q = (x - 1)2 ((x4 - x2 + 1) / 3) + x
- r = (x4 - x2 + 1)
给定上述参数化的素数q和r,我们可以轻松地构造一个在素域Fq上的椭圆曲线,它包含一个阶为r的子群,使得r | (q12 - 1),从而赋予它12的嵌入度。在扩展域Fq2上实例化其六次自同构产生了一个在两个曲线的阶为r的子群元素之间的高效双线性配对函数,进入Fq12的阶为r的乘法子群。
在zk-SNARK方案中,我们要求Fr具有大的2n根的统一性,以进行高效快速傅里叶变换。因此,保证大2n | (r - 1),或者等价地,x具有大的2n因子,会产生适合zk-SNARKs的BLS12曲线。
由于最近的研究,许多人估计 q 应该大约是 384 位,以实现 128 位的加密安全。方便的是,当 q 大约是 384 位时,r 大约是 256 位,这使得 BLS12 曲线非常适合 128 位的加密安全。这也使它们非常适合许多 zk-SNARK 应用,因为标量场可以用于嵌入式曲线构造等密钥材料。
许多曲线符合我们的描述,但我们出于效率考虑需要一些额外的属性。
- q 应该小于 2383,而 r 应该小于 2255,这样在使用 64 位或 32 位肢体时,最高位未被设置。这允许进行低成本减少。
- Fq12 通常使用扩展域的塔来构建。作为对嵌入度为 24 的 BLS 曲线的研究成果(参见 研究),我们可以确定 BLS12 曲线的子族(在我们的应用中,x mod 72 = {16, 64}),这些子族可以产生高效的扩展域塔和扭曲同构。
- 我们希望 x 的汉明重量很小,以增加配对函数的性能。
BLS12-381 实现
BLS12-381 构造通过以下代码实现:x = -0xd201000000010000
,这产生了最大的 q
和最小的 x
汉明重量,满足上述要求。这产生
- q =
0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
(381 位) - r =
0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
(255 位)
我们的扩展域塔构建如下
- Fq2 构建为 Fq(u) / (u2 - β),其中 β = -1。
- Fq6 构建为 Fq2(v) / (v3 - ξ),其中 ξ = u + 1
- Fq12 构建为 Fq6(w) / (w2 - γ),其中 γ = v
现在,我们实例化椭圆曲线 E(Fq) : y2 = x3 + 4,和椭圆曲线 E'(Fq2) : y2 = x3 + 4(u + 1)。
群 G1 是 E 的 r 阶子群,其系数为 (x - 1)2 / 3。群 G2 是 E' 的 r 阶子群,其系数为 (x8 - 4x7 + 5x6 - 4x4 + 6x3 - 4x2 - 4x + 13) / 9。
生成器
G1 和 G2 的生成器通过寻找字典序最小的有效 x
坐标,以及其字典序最小的 y
坐标,并按系数缩放以使结果不是无穷远点来计算。
G1
x = 3685416753713387016781088315183077757961620795782546409894578378688607592378376318836054947676345821548104185464507
y = 1339506544944476473020471379941921221584933875938349620426543736416511423956333506472724655353366534992391756441569
G2
x = 3059144344244213709971259814753781636986470325476647558659373206291635324768958432433509563104347017837885763365758*u + 352701069587466618187139116011060144890029952792775240219908644239793785735715026873347600343865175952761926303160
y = 927553665492332455747201965776037880757740193453592970025027978793976877002675564980949289727957565575433344219582*u + 1985150602287291935568054521177171638300868978215655730859378665066344726373823718423869104263333984641494340347905
许可证
根据您的选择,受 Apache License, Version 2.0 或 MIT 许可证的许可。除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在此软件包中的贡献,将按上述方式双重许可,而无需任何额外条款或条件。
依赖项
~4.5–6MB
~186K SLoC