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

问题描述 投票:3回答:2

我正在使用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]
"�K\u{e}�6x����5D\u{7f}�|\u{8}Half"

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

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

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

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

rust aes
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.