我正在尝试使用this example中的rust-crypto
将Node.js函数转换为将存储在数据库BLOB中的AES-256-CBC值解密为纯文本。
当我运行一个对字符串进行加密然后再使用密钥和已知IV对其进行解密的测试时,所有这些都能按预期工作,因此我知道encrypt()
和decrypt()
函数可以正常工作,但是在运行时以前加密的数据出现各种错误,而且没有纯文本。
我认为问题可能与提取IV有关,如果我使用&raw_encrypted[0..16]
会出现Option
错误,如果我使用&raw_encrypted[1..16]
(我最初是无意中这样做的)尝试转换为UTF8时出现Result
错误。...但是我还是Rust的新手,可能完全不合时宜。
错误
在一个
Option::unwrap()
值上称为None
在一个
Result::unwrap()
值上称为Err
:FromUtf8Error {字节:[...字符...]}
铁锈
let (encrypted) = mysql::from_row(row);
let raw_encrypted: Vec<u8> = encrypted;
let iv = &raw_encrypted[0..16];
let content = &raw_encrypted[16..raw_encrypted.len()];
let decipher = &decrypt(content, &key, &iv).ok().unwrap();
let json = String::from_utf8(decipher.to_vec()).unwrap();
我要从中转换的有效Javascript如下所示:
节点
function decrypt(encrypted, key) {
const iv = encrypted.slice(0, self._iv_length);
const content = encrypted.slice(self._iv_length, encrypted.length);
const decipher = crypto.createDecipheriv(self._algorithm, key, iv);
const json = decipher.update(content, undefined, 'utf8') + decipher.final('utf8');
return json;
}