如何让Rust的openssl crate解密来自对称加密gem的数据而没有Node Crypto自动删除的乱码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让Rust的openssl crate解密来自对称加密gem的数据而没有Node Crypto自动删除的乱码?相关的知识,希望对你有一定的参考价值。

我正在使用Rust中的对称加密gem解密Ruby on Rails应用程序创建的遗留数据。请参阅我之前的问题How do I decrypt data encrypted by Ruby's `symmetric-encryption` gem in another language?

我已经在Node中实现了这一点,其中加密库似乎知道如何在加密的字符串中删除Rust的openssl crate没有剥离的乱码(至少,我正在使用它的方式)。我已经删除了PKCS7填充和标题,但它仍然存在。什么是gobbledygook,我如何让Rust删除它?

加密数据以明文形式开头,具有固定大小的标头,使用带有PKCS7填充的AES-128-CBC加密,然后进行Base64编码。使用Node,我可以使用以下代码正确解密:

const crypto = require("crypto");

const KEY = Buffer.from("1234567890ABCDEF");
const IV = Buffer.from("1234567890ABCDEF");
const CIPHERTEXT = Buffer.from("QEVuQwBAEACuPUPByDkk5jyNzQ3Wd3xTy2Isihz62XTLe1M5qKQrvw==", "base64");
const HEADER_SIZE = 8;
const ALGO = "aes-128-cbc";

const decipher = crypto.createDecipheriv(ALGO, KEY, IV);

decipher.update(CIPHERTEXT.slice(HEADER_SIZE));
const result = decipher.final();

console.log([...result]);
console.log(result.toString());

结果是

[ 72, 97, 108, 102 ]
Half

我更喜欢使用Rust来编写我正在编写的应用程序。使用openssl crate,我可以解码加密数据,但是有一堆垃圾,Node的库知道如何剥离,但Rust不会像我使用它那样自动剥离:

extern crate base64;
extern crate openssl;

use openssl::symm::*;

const KEY: &'static [u8] = b"1234567890ABCDEF";
const IV: &'static [u8] = b"1234567890ABCDEF";
const CIPHERTEXT: &'static str = "QEVuQwBAEACuPUPByDkk5jyNzQ3Wd3xTy2Isihz62XTLe1M5qKQrvw==";
const HEADER_SIZE: usize = 8;

fn main() {
    let decoded = base64::decode(&CIPHERTEXT).unwrap();
    let ciphertext = &decoded[HEADER_SIZE..];

    let result = decrypt(Cipher::aes_128_cbc(), KEY, Some(IV), ciphertext).unwrap();
    println!("{:?}", result);
    println!("{:?}", String::from_utf8_lossy(&result));
}

结果如下

[221, 75, 14, 215, 54, 120, 246, 222, 194, 208, 53, 68, 127, 190, 124, 8, 72, 97, 108, 102]
"�Ku{e}�6x����5Du{7f}�|u{8}Half"

您可以看到最后四个字节是正确的,但该节点剥离了前面的16个字节,因为它应该具有。我不知道这些字节是什么。

起初我认为16个字节的乱码来自于尝试解密PKCS7填充。但我可以验证填充是否已被剥离:如果我按照Crypter crate的openssl中的示例创建documentation,但不包括truncate()步骤,生成的Vec有12个连续的12s-PKCS7填充 - 这是自动的除去。

所以乱码不是PKCS7填充,但我不知道它是什么或如何使用Rust摆脱它。

如果我不是专家,那么预测米兰达警告不要使用加密技术:这不会用于生产或创建数据投入生产。

以上是关于如何让Rust的openssl crate解密来自对称加密gem的数据而没有Node Crypto自动删除的乱码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 crate 中将 Rust 项目设为公开,但在其外部设为私有?

Rust编程语言入门之cargocrates.io

Rust: Cargo 使用本地 crate

如何找到 Rust 库的当前版本?

Rust, 替换 crates.io 为国内镜像站 crates.cn

Rust更换Crates源