如何让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个连续的12
s-PKCS7填充 - 这是自动的除去。
所以乱码不是PKCS7填充,但我不知道它是什么或如何使用Rust摆脱它。
如果我不是专家,那么预测米兰达警告不要使用加密技术:这不会用于生产或创建数据投入生产。
以上是关于如何让Rust的openssl crate解密来自对称加密gem的数据而没有Node Crypto自动删除的乱码?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 crate 中将 Rust 项目设为公开,但在其外部设为私有?