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 密码学

Download history 481/week @ 2024-05-03 349/week @ 2024-05-10 370/week @ 2024-05-17 236/week @ 2024-05-24 280/week @ 2024-05-31 424/week @ 2024-06-07 504/week @ 2024-06-14 508/week @ 2024-06-21 265/week @ 2024-06-28 442/week @ 2024-07-05 390/week @ 2024-07-12 228/week @ 2024-07-19 401/week @ 2024-07-26 470/week @ 2024-08-02 420/week @ 2024-08-09 369/week @ 2024-08-16

1,700 每月下载量
3 crates 中使用

MIT/Apache

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)

给定上述参数化的素数qr,我们可以轻松地构造一个在素域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 位)

我们的扩展域塔构建如下

  1. Fq2 构建为 Fq(u) / (u2 - β),其中 β = -1。
  2. Fq6 构建为 Fq2(v) / (v3 - ξ),其中 ξ = u + 1
  3. 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