如何计算给定 BLS Public 密钥和消息的椭圆曲线配对函数
How To Calculate Elliptic Curve Pairing Function Given BLS Public Key and Message
我正在尝试为给定 public 密钥和消息的 BLS 密码系统计算曲线对。我用 bls_signatures crate and ultimately want to crunch e(pub_key, HashToCurve(message))
using the blstrs crate (since I found 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 和这种类型的密码学都是新手,所以欢迎任何指导。给定 public 密钥和消息,您将如何计算配对?
当我查看所有源代码并写下我的原始答案时,我才意识到这个简单的解决方案。这就像更改 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);
}
我正在尝试为给定 public 密钥和消息的 BLS 密码系统计算曲线对。我用 bls_signatures crate and ultimately want to crunch e(pub_key, HashToCurve(message))
using the blstrs crate (since I found 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 和这种类型的密码学都是新手,所以欢迎任何指导。给定 public 密钥和消息,您将如何计算配对?
当我查看所有源代码并写下我的原始答案时,我才意识到这个简单的解决方案。这就像更改 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);
}