我有一个AES 128 CFB加密字符串,需要解密它。
加密字符串:NpevHdSNWoXzXXzndH4WgRnM6QChqPwI8wguZ3iCOzGo4sG1RtHRiGGMkPcR2EaHOqJ22LQUcTM2BLKe6rQAdHJ58E/E/OpCY5wV45AYqJIgB2Yx4GbfeNeo0Do0AGhfVdbFFTybSElpJoLVdX5a4KWQVifKrw
密钥:bKxh 4vz 1 WpDnMlK 7
我有JavaScript函数,可以使用crypto-js库成功解密
const decryptURL = src => {
var key = 'bKxh4vz1WpDnMlK7';
var base64data = CryptoJS.enc.Base64.parse(src);
var encrypted = new CryptoJS.lib.WordArray.init(
base64data.words.slice(4),
base64data.sigBytes - 16,
);
var iv = new CryptoJS.lib.WordArray.init(base64data.words.slice(0, 4));
var cipher = CryptoJS.lib.CipherParams.create({ciphertext: encrypted});
var decrypted = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(key), {
iv: iv,
mode: CryptoJS.mode.CFB,
padding: CryptoJS.pad.NoPadding,
});
return decrypted.toString(CryptoJS.enc.Utf8);
};
我已经尝试了许多解决方案,但仍然没有运气解密它,下面是我的解密功能
extension StringEx on String {
Map<dynamic, dynamic> get decryptData {
final key = encrypt.Key.fromUtf8('bKxh4vz1WpDnMlK7');
final base64data = base64.decode(base64.normalize(this));
final encrypted = base64data.sublist(4, base64data.length - 16); // Assuming 16 bytes are the IV in CryptoJS
final iv = base64data.sublist(0, 4); // Assuming 16 bytes are the IV in CryptoJS
final encrypter = encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cfb64, padding: null));
final decryptedBytes = encrypter.decrypt(encrypt.Encrypted(encrypted), iv: encrypt.IV(iv));
final dataMap = jsonDecode(decryptedBytes);
return dataMap;
}
}
任何帮助将不胜感激,非常感谢!
1条答案
按热度按时间gpfsuwkq1#
CryptoJS和Dart代码不兼容,因为1.所使用的段大小是不同的,并且2.与CryptoJS代码不同,Dart代码只能处理长度为段大小的整数倍的明文。
CryptoJS代码使用128位的段大小(CFB-128),而Dart代码使用64位的段大小(CFB-64)。段的大小不能在任何一个库中更改,所以在Dart端,encrypt 库不能用于解密CryptoJS代码的密文。
因此,在Dart方面,需要另一个也支持CFB-128的库。一种可能性是 PointyCastle(注意 encrypt 库是 PointyCastle 的子功能的 Package 器,所以实际上直接使用相同的库)。
然而,PointyCastle(以及 encrypt 库)的CFB实现只能加密长度为段大小的整数倍的明文,即:对于CFB-128,为块大小的整数倍。这通常需要额外的填充,这是低效的,实际上不应该是必要的。
相反,由于这个约束,要用 PointyCastle 解密CryptoJS代码的密文,密文必须在解密之前填充到块大小的整数倍。
为此,可以使用任何填充,例如。零填充(后者是足够的,因为关于填充字节的长度信息由密文的原始长度给出,因此不需要包含在填充中)。
在解密之后,明文必须被取消填充(即,缩短为密文的原始长度)。
使用 PointyCastle 实现CryptoJS密文的一种可能实现是: