#arkworks #hash #round #gadget #key #mi-mc

arkworks-mimc

Akworks实现的加密哈希函数MiMC

2个不稳定版本

0.3.0 2023年4月25日
0.2.0 2023年2月27日
0.1.1 2023年2月24日
0.1.0 2023年2月24日

加密学 中排名 1168

LGPL-3.0-only

110KB
1.5K SLoC

Arkworks MiMC

Arkworks 实现的加密哈希函数 MiMC [AGR+16],在 $n/n$ 非Feistel和 $2n/n$ Feistel块加密中使用可变轮密钥和指数。

R1CS组件和CRH组件特性在 r1cs 包特性下可用。

支持的域参数

我们为一些选定的素域提供预生成的轮密钥,这些素域在 circomlibjs 包中可用。

Feistel ($2n/n$)

  • 在BN254上使用 $x^5$ 的220轮
  • 在BLS12-381上使用 $x^5$ 的220轮
  • 在BLS12-377上使用 $x^5$ 的218轮

非Feistel ($n/n$)

  • 在BN254上使用 $x^7$ 的91轮
  • 在BLS12-381上使用 $x^7$ 的91轮
  • 在BLS12-377上使用 $x^7$ 的90轮

使用方法

自定义轮数和指数

// Create new struct to use as MiMC param
#[derive(Clone, Default)]
struct MyMiMCParams;

// Implement `MiMCParameters` for that struct
impl MiMCParameters for MyMiMCParams {
    const ROUNDS: usize = 220; // Customizable
    const EXPONENT: usize = 3; // Customizable
}

// Randomize MiMC key and round keys
let mimc = <MiMCFeistelCRH<Fr, MyMiMCParams> as CRHTrait>::setup(rng)?;
// Or initialize with customized key/round keys/outputs
let custom_mimc = MiMC::new(1, Fr::from(1), mimc.round_keys.clone());

// Use MiMC directly,
// Non-Feistel
let _ = mimc.permute_non_feistel(vec![Fr::from(1), Fr::from(0)])
// Feistel
let _ = mimc.permute_feistel(vec![Fr::from(1), Fr::from(0)]);

// Or use MiMC through arkworks's crypto-primitive traits
// CRH
let _ = <MiMCNonFeistelCRH<_, _> as CRH>::evaluate(
    &mimc,
    &to_bytes!(Fr::from(1))?
)?;
// CRH
let _ = <MiMCFeistelCRH<_, _> as TwoToOneCRH>::evaluate(
    &mimc,
    &to_bytes!(Fr::from(1))?
)?;

预生成轮数

启用包含将要使用的参数的特定功能。

cargo.toml

arkworks-mimc = { ..., features = ["mimc-7-91-bn254"] }

.rs

let mimc = MiMC::<Fr, MIMC_7_91_BN254_PARAMS>::new(
    1,
    Fr::zero(),
    round_keys_contants_to_vec(&MIMC_7_91_BN254_ROUND_KEYS),
);

依赖项

~3.5–8.5MB
~173K SLoC