在 Rust 中使用 DES-ECB 解密字符串

问题描述 投票:0回答:1

我正在尝试使用 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 机器上抛出错误。

rust encryption openssl des
1个回答
0
投票

当我在本地 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
)。

© www.soinside.com 2019 - 2024. All rights reserved.