14个版本 (9个破坏性版本)
0.10.0 | 2021年11月18日 |
---|---|
0.9.0 | 2021年4月13日 |
0.8.0 | 2020年9月28日 |
0.7.0 | 2020年3月10日 |
0.3.0 | 2018年11月20日 |
#1601 in 密码学
每月下载量395
在3个crate中使用(通过recrypt)
100KB
2K SLoC
Gridiron
要使用此库,您可以使用提供的有限域之一,或者调用宏来创建自己的。包括的两种是
fp_480::Fp480
fp_256::Fp256
创建方式如下
// p = 65000549695646603732796438742359905742825358107623003571877145026864184071783
fp31!(
fp_256, // Name of mod
Fp256, // Name of class
256, // Number of bits for prime
9, // Number of limbs (ceil(bits/31))
[
// prime number in limbs, least sig first
// get this from sage with p.digits(2^31)
1577621095, 817453272, 47634040, 1927038601, 407749150, 1308464908, 685899370, 1518399909,
143
],
// barrett reduction for reducing values up to twice
// the number of prime bits (double limbs):
// floor(2^(31*numlimbs*2)/p)
[
618474456, 1306750627, 1454330209, 2032300189, 1138536719, 1905629153, 1016481908,
1139000707, 1048853973, 14943480
],
// montgomery R = 2^(W*N) where W = word size and N = limbs
// R = 2^(9*31) = 2^279
// montgomery R^-1 mod p
// 41128241662407537452081084990737892697811449013582128001435272241165411523443
[
1126407027, 1409097648, 718270744, 92148126, 1120340506, 1733383256, 1472506103,
1994474164, 90
],
// montgomery R^2 mod p
// 26753832205083639112203412356185740914827891884263043594389452794758614404120
[
1687342104, 733402836, 182672516, 801641709, 2122695487, 1290522951, 66525586, 319877849,
59
],
// -p[0]^-1
// in sage: m = p.digits(2^31)[0]
// (-m).inverse_mod(2^31)
2132269737
);
为了使用它,您需要导入所需数学操作的头部。例如
use std::ops::Add;
let one = fp_256::Fp256::one();
let two = one + one;
此库提供的所有操作都是常数时间(这意味着它们已实现以防止提取应保密的值的时间或内存访问模式侧信道攻击)除了
Mul<u64>
, Pow<u64>
- 如果需要这些操作的常数时间版本,您可以将它们提升到Fp类型并使用 Mul<Fp>
和 Pow<Fp>
。这将要慢得多,通常u64不是保密值,所以它们不是常数时间也是可以的。
代码审计
NCC集团的安全加密服务团队对库进行了审计——发布版本 0.6.0 包含了所有经过审计的代码,包括为解决审计中发现的问题而创建的更新。NCC集团的审计发现,选择的配对和椭圆曲线在密码学上是可靠的,并且Rust实现是目标协议的忠实且正确的体现。此外,审计特别检查了通过时间或内存访问模式旁路攻击泄露秘密信息的情况,但没有发现此类泄露。
版权所有(c)2018-至今 IronCore Labs,Inc。保留所有权利。
依赖项
~155KB