7个版本
0.1.6 | 2024年5月11日 |
---|---|
0.1.5 | 2024年5月6日 |
#331 在 加密学 分类中
每月 77 次下载
37KB
748 行
模运算库
modular_math
是一个Rust库,专为在256位整数上执行高性能模运算而设计(U256
)。此库提供强大的功能,如
- 模运算
- 加法
- 减法
- 乘法
- 指数运算
- 求逆
- 除法
- 平方
- 平方根(tonelli shanks算法)
- 等价(同余)
- 椭圆曲线
- 点加法
- 点双倍
- 标量乘法
- 使用生成点进行标量乘法
- BN128曲线
- Secp256k1曲线
- 伽罗瓦域(进行中)
- 多项式
在指定模数下,特别针对加密和零知识应用中的频繁运算进行了优化。
特性
- 全面的模运算和椭圆曲线:提供对
U256
和BN128以及Secp256k1椭圆曲线的所有必要的模运算。 - 安全的溢出管理:使用
U512
作为中间结果,以防止溢出。 - 灵活的类型支持:具有
IntoU256
特质,可以将各种整数和字符串类型转换为U256
。 - 高性能:在保证准确性的同时优化性能,特别适用于加密和零知识应用。
- 易于使用的宏:提供宏以方便使用模数下的数字。
结构
工作空间组织如下
- src/curves/: 包含椭圆曲线和曲线上的点的实现。
- src/galois_field/: 包含伽罗瓦域的实现,用于椭圆曲线运算。
- src/mod_math/: 包含模运算函数。
- src/num_mod/: 包含对某些模数的数字实现。
用法
首先,将以下内容添加到您的Cargo.toml
[dependencies]
modular_math = "0.1.6"
ModMath
use modular_math::ModMath;
use primitive_types::U256;
let modulus = "101";
let mod_math = ModMath::new(modulus);
// Addition
let sum = mod_math.add(8, 12);
assert_eq!(sum, U256::from(3));
// Subtraction
let sub = mod_math.sub(8, 12);
assert_eq!(sub, U256::from(97));
// Multiplication
let mul = mod_math.mul(8, 12);
assert_eq!(mul, U256::from(96));
// Multiplicative Inverse
let inv = mod_math.inv(8);
assert_eq!(inv, U256::from(77));
// Exponentiation
let exp = mod_math.exp(8, 12);
assert_eq!(exp, U256::from(64));
// FromStr
let mod_math = ModMath::new("115792089237316195423570985008687907852837564279074904382605163141518161494337");
let div = mod_math.div("32670510020758816978083085130507043184471273380659243275938904335757337482424" , "55066263022277343669578718895168534326250603453777594175500187360389116729240");
assert_eq!(div, U256::from_dec_str("13499648161236477938760301359943791721062504425530739546045302818736391397630"));
椭圆曲线
创建椭圆曲线
use primitive_types::U256;
use modular_math::elliptical_curve::{Curve, ECPoint};
fn BN128() -> Curve {
let a = U256::zero();
let b = U256::from(3);
let field_modulus = U256::from_dec_str("21888242871839275222246405745257275088696311157297823662689037894645226208583").unwrap();
let curve_order = U256::from_dec_str("21888242871839275222246405745257275088548364400416034343698204186575808495617").unwrap();
let G = ECPoint::new(U256::from(1), U256::from(2));
let bn128 = Curve::new(a, b, field_modulus, curve_order, G);
bn128
}
BN128用法
use modular_math::curves::BN128;
use primitive_types::U256;
let bn128 = BN128();
let G = bn128.G;
// Scalar Multiplication
let double_G = bn128.point_multiplication_scalar(2, &G);
// Point Addition
let triple_G = bn128.point_addition(&double_G, &G);
// Point Doubling
let quad_G = bn128.point_doubling(&double_G);
模数下的数字
use modular_math::number_mod::NumberUnderMod as NM;
use primitive_types::U256;
use modular_math::num_mod;
// Add
let a = num_mod!(10, 13);
let b = num_mod!(6, 13);
let sum = a + b;
assert_eq!(sum, U256::from(3));
// Sub
let sub = a - b;
assert_eq!(sub, U256::from(4));
// Mul
let mul = a * b;
assert_eq!(mul, U256::from(8));
// Div
let div = a / b;
assert_eq!(div, U256::from(11));
// Neg
let neg = -a;
assert_eq!(neg, U256::from(3));
let c = num_mod!(10, 13);
assert!(a == c);
待办事项
- 模数下的平方根
- 加法逆元
- 大数字测试
- 椭圆曲线
- 伽罗瓦域
- 双线性配对
许可证
本项目采用MIT许可协议 - 有关详细信息,请参阅LICENSE文件。
依赖项
~605KB
~10K SLoC