#模运算 #曲线 #椭圆曲线 #u256 # #乘法 #取模

modular_math

U256的简单模运算库

7个版本

0.1.6 2024年5月11日
0.1.5 2024年5月6日

#331加密学 分类中

Download history 309/week @ 2024-04-29 552/week @ 2024-05-06 16/week @ 2024-05-13 20/week @ 2024-05-20 76/week @ 2024-07-01 1/week @ 2024-07-22

每月 77 次下载

MIT 许可证

37KB
748

模运算库

crates.io Docs.rs

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