我正在尝试使用 Rust 中的
DES-ECB
加密算法来解密字符串。我有以下加密字符串:
ID2ieOjCrwfgWvL5sXl4B1ImC5QfbsDyzIPKrPZsLT6XiYvvt4HzTf4FNdlY3djNa2mCXTFAkYtwZjohCZ6rhxw7tS9a8Gtq
关键是
38346591
。我正在尝试使用 Rust OpenSSL 箱来实现此目的。
这是我尝试过的代码:
use base64::{engine::general_purpose, Engine as _};
use openssl::error::ErrorStack;
use openssl::symm::{decrypt, Cipher};
fn main() -> Result<(), ErrorStack> {
let key = b"38346591";
let encrypted_data_b64 = b"ID2ieOjCrwfgWvL5sXl4B1ImC5QfbsDyzIPKrPZsLT6XiYvvt4HzTf4FNdlY3djNa2mCXTFAkYtwZjohCZ6rhxw7tS9a8Gtq";
let encrypted_data = general_purpose::STANDARD
.decode(&encrypted_data_b64)
.unwrap();
let cipher = Cipher::des_ecb();
let decrypted = decrypt(cipher, key, None, &encrypted_data)?;
println!(
"Decrypted Data: {:?}",
String::from_utf8(decrypted).unwrap()
);
Ok(())
}
但是,当我运行此代码时,出现以下错误:
[Error { code: 50856204, library: "digital envelope routines", function: "inner_evp_generic_fetch", reason: "unsupported", file: "crypto/evp/evp_fetch.c", line: 341, data: "Global default library context, Algorithm (DES-ECB : 17), Properties ()" }]
此外,我还尝试使用 OpenSSL 箱中的解密函数来实现此目的,但它也不起作用。
似乎不支持
DES-ECB
或者我的方法有问题。谁能帮我弄清楚如何在 Rust 中使用 DES-ECB 正确解密该字符串?任何指导或替代方法将不胜感激。谢谢!
编辑:代码在 Rust Playground 上运行良好(gist link),但在我的 Arch 机器上抛出错误。
当我在本地 m2 机器上运行您的代码时,我收到相同的错误:
Error: ErrorStack([Error { code: 50856204, library: "digital envelope routines", function: "inner_evp_generic_fetch", reason: "unsupported", file: "crypto/evp/evp_fetch.c", line: 355, data: "Global default library context, Algorithm (DES-ECB : 52), Properties ()" }])
原因是,自从板条箱版本“0.10..”以来,
openssl
板条箱已切换到OpenSSL3
,这已将旧的和弱的算法标记为已弃用,并且默认情况下不再支持它们。
因此,首先您需要确保链接到您的应用程序并由您的应用程序使用的 Openssl 安装是在
legacy
支持下构建的。
然后您需要加载旧提供程序(作为默认提供程序)。然后上面的代码就可以工作了。为了实现它,这里是更新的源代码:
use base64::{Engine as _, engine::general_purpose};
use openssl::error::ErrorStack;
use openssl::provider::Provider;
use openssl::symm::{Cipher, decrypt};
fn main() -> Result<(), ErrorStack> {
let provider = Provider::load(None, "legacy").unwrap();
let key = b"38346591";
let encrypted_data_b64 = b"ID2ieOjCrwfgWvL5sXl4B1ImC5QfbsDyzIPKrPZsLT6XiYvvt4HzTf4FNdlY3djNa2mCXTFAkYtwZjohCZ6rhxw7tS9a8Gtq";
let encrypted_data = general_purpose::STANDARD
.decode(&encrypted_data_b64)
.unwrap();
let cipher = Cipher::des_ecb();
let decrypted = decrypt(cipher, key, None, &encrypted_data)?;
println!(
"Decrypted Data: {:?}",
String::from_utf8(decrypted).unwrap()
);
Ok(())
}
请注意将
legacy
提供商添加到 default
上下文中(即 None
)。