#rust #cryptography #elliptic-curve
Вопрос:
Я пытаюсь рассчитать пары кривых для криптосистемы BLS с учетом открытого ключа и сообщения. Я генерирую ключ с помощью ящика bls_signatures и в конечном итоге хочу e(pub_key, HashToCurve(message))
запустить его с помощью ящика blstrs (так как я нашел там функцию сопряжения).
let priv_key = bls_signatures::PrivateKey::new(amp;[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(amp;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::сопряжение() для достижения своей цели, но, может быть, есть лучший способ?), библиотеке blstrs это не нравится:
let pub_key_affine_bytes: [u8; 96] = pub_key_affine_bytes.try_into().unwrap();
assert!(blstrs::G1Affine::from_uncompressed(amp;pub_key_affine_bytes) == None); // instead of Some(_)
Вероятно, сейчас это уже очевидно, но я новичок как в Rust, так и в этом типе криптографии, поэтому любые рекомендации приветствуются. Как бы вы рассчитали пары с учетом открытого ключа и сообщения?
Комментарии:
1. Вы взглянули на ffi , стоящую за blstrs? По крайней мере, там вы можете ссылаться на API C, и в стендах и тестах есть несколько полезных фрагментов кода
2. Спасибо за ссылки, но я тщательно искал, но безуспешно.
Ответ №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(amp;[0_u8; 32]); // not secure, but repeatable
let affine = priv_key
.public_key()
.as_affine(); // blstrs::G1Affine, no longer from paired!
println!("{:?}", affine);
}