【发布时间】: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 和这种类型的密码学都是新手,所以欢迎任何指导。给定公钥和消息,您将如何计算配对?
【问题讨论】:
标签: rust cryptography elliptic-curve