2 个版本

0.1.14 2023年7月12日
0.1.13 2023年7月12日
0.1.8 2023年6月30日

#443加密学

每月 25 次下载

MIT/Apache

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