【问题标题】:How To Calculate Elliptic Curve Pairing Function Given BLS Public Key and Message如何计算给定 BLS 公钥和消息的椭圆曲线配对函数
【发布时间】:2021-10-10 01:22:34
【问题描述】:

在给定公钥和消息的情况下,我正在尝试计算 BLS 密码系统的曲线配对。我使用bls_signatures crate 生成密钥,最终想使用blstrs crate 处理e(pub_key, HashToCurve(message))(因为我在那里找到了a pairing function)。

let priv_key = bls_signatures::PrivateKey::new(&[0_u8; 32]);  // not secure, but repeatable

let mut buff = std::io::Cursor::new(vec![]);

let _bytes_written = priv_key
    .public_key()
    .as_affine()
    .write_raw(&mut buff);
    
let mut pub_key_affine_bytes: Vec<u8> = buff.into_inner();

第一个问题是paired::bls12_381::G1Affine::write_raw() 似乎在开头添加了一个无关紧要的零,给了我 97 个字节而不是 96 个字节:

assert!(pub_key_affine_bytes.len() == 97_usize);  // instead of 96
assert!(pub_key_affine_bytes[0] == 0_u8); // regardless of key used... which seems wrong

我现在可以通过let _ = pub_key_affine_bytes.remove(0);“修复”它,但是当我尝试转换为blstrs::G1Affine(希望使用blstrs::pairing() 来实现我的目标,但也许有更好的方法?)时, blstrs 库不喜欢它:

let pub_key_affine_bytes: [u8; 96] = pub_key_affine_bytes.try_into().unwrap();
assert!(blstrs::G1Affine::from_uncompressed(&pub_key_affine_bytes) == None);    // instead of Some(_)

现在可能很明显,但我对 Rust 和这种类型的密码学都是新手,所以欢迎任何指导。给定公钥和消息,您将如何计算配对?

【问题讨论】:

  • 你看过blstrs后面的ffi了吗?至少在那里你可以参考C API,benchestests中有一些有用的代码sn-ps
  • 感谢您的链接,但我已经彻底搜索但没有成功。

标签: rust cryptography elliptic-curve


【解决方案1】:

当我浏览完所有源代码并写下我的原始答案后,我才意识到这个简单的解决方案。就像更改 Cargo.toml 中启用的功能以禁用 paired 的使用并启用 blstrs 以供内部使用一样简单。

[package]
name = "blst_test"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
blstrs = "^0.3"
bls-signatures = {version="0.10.0", default-features= false, features=["blst"] }

修复后,下面的工作就很好了

fn main() {

    let priv_key = bls_signatures::PrivateKey::new(&[0_u8; 32]);  // not secure, but repeatable

    let affine = priv_key
        .public_key()
        .as_affine(); // blstrs::G1Affine, no longer from paired!
        

    println!("{:?}", affine);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2013-11-09
    • 2020-03-04
    • 1970-01-01
    • 2020-03-08
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多