10个不稳定版本 (3个重大变更)
使用旧的Rust 2015
0.4.3 | 2017年4月2日 |
---|---|
0.4.2 | 2016年12月14日 |
0.4.1 | 2016年10月14日 |
0.4.0 | 2016年9月19日 |
0.1.0 | 2016年7月6日 |
在加密学中排名1873
每月下载量49次
在zksnark中使用
2.5MB
2.5K SLoC
bn
这是一个用纯Rust编写的配对密码学库。它利用来自[BCTV2015]的Barreto-Naehrig (BN)曲线构造,提供两个循环群 G1 和 G2,并具有高效的双线性配对
e: G1 × G2 → GT
安全警告
这个库,像其他实现这种结构的配对密码学库一样,不受侧信道攻击的影响。
用法
将bn
crate添加到Cargo.toml
中的依赖项...
[dependencies]
bn = "0.4.3"
...并在crate根目录中添加一个extern crate
声明
extern crate bn;
API
Fr
是Fr的一个元素G1
是BN曲线E/Fq : y^2 = x^3 + b上的一个点G2
是扭曲的BN曲线E'/Fq2 : y^2 = x^3 + b/xi上的一个点Gt
是通过在G1
和G2
上使用pairing
函数获得的群元素(乘法表示)。
示例
Joux密钥协商协议
在典型的Diffie-Hellman密钥交换中,依赖于ECDLP,三方密钥交换需要两轮。通过使用双线性配对,可以实现单轮协议:给定Alice的公钥aP1和Bob的公钥bP2,Carol可以通过e(aP1, bP2)c使用她的私钥c计算共享密钥。
(完整示例请见examples/joux.rs
)
// Generate private keys
let alice_sk = Fr::random(rng);
let bob_sk = Fr::random(rng);
let carol_sk = Fr::random(rng);
// Generate public keys in G1 and G2
let (alice_pk1, alice_pk2) = (G1::one() * alice_sk, G2::one() * alice_sk);
let (bob_pk1, bob_pk2) = (G1::one() * bob_sk, G2::one() * bob_sk);
let (carol_pk1, carol_pk2) = (G1::one() * carol_sk, G2::one() * carol_sk);
// Each party computes the shared secret
let alice_ss = pairing(bob_pk1, carol_pk2).pow(alice_sk);
let bob_ss = pairing(carol_pk1, alice_pk2).pow(bob_sk);
let carol_ss = pairing(alice_pk1, bob_pk2).pow(carol_sk);
assert!(alice_ss == bob_ss && bob_ss == carol_ss);
许可协议
在以下任一协议下许可:
- MIT许可证,(LICENSE-MIT或http://opensource.org/licenses/MIT)
- Apache许可证,版本2.0 (LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
任选其一。
版权所有2016 Zcash Electric Coin Company。Zcash公司承诺在crates.io上根据此MIT/Apache-2.0双许可证维护"bn"crate。
作者
贡献
除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交供工作包含的贡献应双重许可,如上所述,不附加任何额外条款或条件。