rust - 如何从作为十六进制编码字符串给出的模数和指数构造公钥?

标签 rust cryptography

我正在尝试使用以下模数加密密码:

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 的字节数.

最佳答案

首先,我不建议传递一个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()
}

Playground link

它迭代字符串中的字节对,将每一对转换为 &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 crate,还有一个更简单的解决方案,使用 openssl::bn::from_hex_str :

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

关于rust - 如何从作为十六进制编码字符串给出的模数和指数构造公钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54162294/

相关文章:

struct - 有没有一种方法可以将递归结构/枚举设置为默认值?

java - 无法将 SHA256 与来自 Java on .Net c# 的 RSA 签名进行匹配

java - 使用此椭圆曲线点乘法计算的点不在曲线上,此类带来算术异常

encryption - 使用 RSA-1024 签名 SHA-256 摘要 : what is the size?

java - 如何判断EC点是否在曲线上?

java - hmac init 的 iv 值与 java 中的默认值不同

methods - 为什么 Vec::len 是方法而不是公共(public)属性?

rust - 如何直接创建一个String?

formatting - 使用 GDB 调试 Rust 程序时,如何使用格式打印?

char - 为什么换行符在 BTreeMap 中算作两个键?