Как создать открытый ключ из модуля и показателя степени, заданного в виде шестнадцатеричной строки? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь зашифровать пароль со следующим модулем:

cc7e2fe78c235b7eff9beb63696dbbf565b04b26902d7b1133813821e614da7b0a694a17a564192de3389adc1ab705642f966a120ef74ace060f8eeb53a91d1bbc98a3ed9f53f5a40d3cc814da56ad5ba8581b7e96b6827bf323706d1836985ac9783d6dcd5c7291a4f84ca9f04a0194fab8bde7b97d15153eb3f5034eb12ef7e2e696beb7d2570e42f3bf5494622f05c0499c47eb8c23f324eac763a924e6ad540906788d571cc6b2536d2e039cf280e6e21616bf26b82e79b28079127a9f92cf04dc9d18f418c637039be6ee4ba9fdee3cbaf3381cce5409277aa18821e61a9ef14c21028f31ae7b2eadd7be4e298d37a47acc0b7c8af3c48ec7aeca8b6111

И показатель степени:

010001

Мне нужно как-то преобразовать их в массив байтов, я новичок в этом, так что пока у меня не было большого успеха.

Я пытался использовать hex::decode() безрезультатно.

let publickey_mod = "cc7e2fe78c235b7eff9beb63696dbbf565b04b26902d7b1133813821e614da7b0a694a17a564192de3389adc1ab705642f966a120ef74ace060f8eeb53a91d1bbc98a3ed9f53f5a40d3cc814da56ad5ba8581b7e96b6827bf323706d1836985ac9783d6dcd5c7291a4f84ca9f04a0194fab8bde7b97d15153eb3f5034eb12ef7e2e696beb7d2570e42f3bf5494622f05c0499c47eb8c23f324eac763a924e6ad540906788d571cc6b2536d2e039cf280e6e21616bf26b82e79b28079127a9f92cf04dc9d18f418c637039be6ee4ba9fdee3cbaf3381cce5409277aa18821e61a9ef14c21028f31ae7b2eadd7be4e298d37a47acc0b7c8af3c48ec7aeca8b6111";
let publickey_exp = "010001"; 
let pass = "TestPass120";
let modnum = BigNum::from_slice(hex_to_bytes(publickey_mod.clone()).as_slice())?;
let expnum = BigNum::from_slice(hex_to_bytes(publickey_exp.clone()).as_slice())?;
let key = Rsa::from_public_components(modnum, expnum)?;
let mut encrypted = vec![0; key.size() as usize];
key.public_encrypt(pass.as_bytes(), &mut encrypted, openssl::rsa::Padding::PKCS1)?;
let encoded = base64::encode(&encrypted);

fn hex_to_bytes(hex: String) -> Vec<u8> {
    // some code that translates hex string to bytes and returns it
}

Ожидаемый результат будет Vec<u8> с байтами, которые я могу предоставить BigNum::from_slice.

1 Ответ

0 голосов
/ 12 января 2019

Прежде всего, я не рекомендую передавать String, а скорее &str ссылку, потому что первая будет перемещать строку в функцию, что в этом случае не требуется. При этом вам больше не нужно клонировать строку, просто потому что ваши две переменные &'static str для начала.

Функция hex_to_bytes может быть построена так:

fn hex_to_bytes(hex: &str) -> Vec<u8> {
    hex.as_bytes()
        .chunks(2)
        .filter_map(|b| std::str::from_utf8(b).ok())
        .filter_map(|s| u8::from_str_radix(s, 16).ok())
        .collect()
}

ссылка на игровую площадку

Он перебирает пару байтов в строке, преобразует каждую пару в & str, который затем преобразуется в u8.

Неверные преобразования просто отбрасываются.

Это можно назвать так:

let modnum = BigNum::from_slice(hex_to_bytes(publickey_mod).as_slice())?;
let expnum = BigNum::from_slice(hex_to_bytes(publickey_exp).as_slice())?;

Наконец, если вы используете ящик openssl, есть еще более простое решение: openssl :: bn :: from_hex_str :

let modnum = BigNum::from_hex_str(publickey_mod)?;
let expnum = BigNum::from_hex_str(publickey_exp)?;
...