18个版本

0.7.1 2023年8月14日
0.7.0 2023年4月14日
0.6.2 2023年9月5日
0.6.1 2022年9月12日
0.2.0 2020年11月30日

#30 in 密码学

Download history 14360/week @ 2024-04-23 12714/week @ 2024-04-30 16705/week @ 2024-05-07 16770/week @ 2024-05-14 15517/week @ 2024-05-21 16026/week @ 2024-05-28 17942/week @ 2024-06-04 18282/week @ 2024-06-11 17921/week @ 2024-06-18 21115/week @ 2024-06-25 14440/week @ 2024-07-02 17643/week @ 2024-07-09 20920/week @ 2024-07-16 20379/week @ 2024-07-23 16394/week @ 2024-07-30 15206/week @ 2024-08-06

75,859每月下载量
用于108个crate (31直接)

MIT/Apache

305KB
9K SLoC

blstrs

BLS12-381对友好椭圆曲线构造的实现,使用blst库作为后端。

发音

最重要的部分,这个名字发音为blasters

支持的平台

由于在blst中的实现基于汇编,目前只支持以下架构

  • 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的子群的元素之间的高效双线性配对函数,到一个阶为r的乘法子群Fq12

在zk-SNARK方案中,我们要求Fr具有大2n单位根,以便执行高效快速傅里叶变换。因此,保证大2n | (r - 1),或者说x有一个大2n因子,产生了适合zk-SNARK的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 License, Version 2.0MIT license
除非您明确声明,否则您提交给本软件包的任何贡献,根据Apache-2.0许可证定义,将根据上述许可证双重许可,不附加任何额外条款或条件。

依赖关系

~4MB
~147K SLoC