rust - 如何计算给定 BLS 公钥和消息的椭圆曲线配对函数
问题描述
在给定公钥和消息的情况下,我正在尝试计算 BLS 密码系统的曲线配对。我使用bls_signatures板条箱生成密钥,最终想e(pub_key, HashToCurve(message))
使用blstrs板条箱进行处理(因为我在那里找到了配对功能)。
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);
但是当我尝试转换为 a 时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 和这种类型的密码学都很陌生,所以欢迎任何指导。给定公钥和消息,您将如何计算配对?
解决方案
当我浏览完所有源代码并写下我的原始答案时,我才意识到这个简单的解决方案。就像更改您启用的功能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);
}
推荐阅读
- python - 根据同一表单中另一个字段的值禁用/启用 Django 表单中的字段
- ios - 基于另一个 observable 动态终止 Observable | RxSwift
- swift - SwiftUI:如何从 MVVM 中的其他 ViewModel 更新 ViewModel
- azure - Azure Blob 存储内部结构
- mysql - 如何使用 URL.Query().Get() 使用 Golang 填写 SELECT 语句
- github - 如何将所有 GitHub 机密信息放入 env 变量中以供 Actions 访问(在我的情况下为 powershell)?
- c# - 在 CMD 中执行命令并访问 git 本地服务器
- jsp - 尝试在我的网络浏览器中运行 JSP 文件时遇到错误
- python - 以pythonic方式检查交织字符串
- python - 何时假设使用 dash m 并避免 __init__?