2 个版本
0.1.14 | 2023年7月12日 |
---|---|
0.1.13 |
|
0.1.8 |
|
#443 在 加密学
每月 25 次下载
27KB
395 行
ec_generic
这个包是一个最小化且易于使用的椭圆曲线库。此库允许在椭圆曲线有限循环群上执行以下操作
- 点加法:
R = P + Q
- 点双倍:
R = P + P = 2 * P
- 标量乘法:
R = d * P
通用椭圆曲线定义为 y^2 = x^3 + ax + b mod p
,在此特定库中,约束条件为
p
应为大于 3 的素数4a^3 + 27b^2 != 0
此库可用于任何需要椭圆曲线群的加密算法,例如
- 数字签名算法 (DSA)
- 零知识证明 (ZKP)
用法
此包位于 crates.io 上,可以通过在项目的 Cargo.toml
中添加 regex
依赖来使用。
[dependencies]
ec_generic = "0.1.14"
示例: y^2 = x^3 + 2x + 2 mod 17
use ec_generic::{EllipticCurve, Point};
use num_bigint::BigUint;
let ec = EllipticCurve {
a: BigUint::from(2u32),
b: BigUint::from(2u32),
p: BigUint::from(17u32),
};
// (6,3) + (5,1) = (10,6)
let p1 = Point::Coor(BigUint::from(6u32), BigUint::from(3u32));
let p2 = Point::Coor(BigUint::from(5u32), BigUint::from(1u32));
let pr = Ok(Point::Coor(BigUint::from(10u32), BigUint::from(6u32)));
let res = ec.add(&p1, &p2);
assert_eq!(res, pr);
let res = ec.add(&p2, &p1);
assert_eq!(res, pr);
示例: secp256k1
: y^2 = x^3 + 7 mod p (large)
use ec_generic::{EllipticCurve, Point};
use num_bigint::BigUint;
let p = BigUint::parse_bytes(
b"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
16,
)
.expect("could not convert p");
let n = BigUint::parse_bytes(
b"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
16,
)
.expect("could not convert n");
let gx = BigUint::parse_bytes(
b"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
16,
)
.expect("could not convert gx");
let gy = BigUint::parse_bytes(
b"483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
16,
)
.expect("could not convert gy");
let ec = EllipticCurve {
a: BigUint::from(0u32),
b: BigUint::from(7u32),
p,
};
let g = Point::Coor(gx, gy);
// n * G = I (Identity)
let res = ec.scalar_mul(&g, &n);
assert_eq!(res, Ok(Point::Identity));
依赖项
~485KB
~10K SLoC