Как Рассчитать Функцию Сопряжения Эллиптической Кривой С Учетом Открытого Ключа BLS и Сообщения

#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);
}