flutter - 使用 flutter/dart 加密并使用 CryptoJS 解密 aes 返回空字符串

标签 flutter dart encryption aes cryptojs

我已经使用 dart 库在 flutter 中加密 encrypt 。下面是代码示例:

  import 'package:encrypt/encrypt.dart' as enc;
  final key = enc.Key.fromUtf8('Thisisasamplekeythatamusinginmyc'); //32 chars
  final iv = enc.IV.fromUtf8('thisismysampleiv');//16 chars

  String encryptMyData(String text) {
  final e = enc.Encrypter(enc.AES(key));
  final encrypted_data = e.encrypt(text, iv: iv);
  return encrypted_data.base64;
  }

我能够加密,但当我尝试使用 JavaScript 中的此代码(使用 Crypto-JS)解密代码时,就会出现问题:

const cryptkey = CryptoJS.enc.Utf8.parse('Thisisasamplekeythatamusinginmyc');
const crypted = CryptoJS.enc.Base64.parse("fdsUYHdv/5PoJSoZGwWppw==");

var decrypt = CryptoJS.AES.decrypt({ciphertext: crypted}, cryptkey, {
    iv: CryptoJS.enc.Hex.parse('thisismysampleiv'),
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});

console.log(decrypt.toString(CryptoJS.enc.Utf8));

问题是它总是返回空字符串,即使使用 AES.js 库也是如此。

我看过this answer但同样的问题也存在。

最佳答案

CryptoJS 代码不兼容,因为 IV 解码不正确。必须使用 Utf8 编码器,而不是 Hex 编码器。
此外,加密库默认应用CTR模式。因此,在CryptoJS代码中必须使用CTR模式而不是CBC模式:

const cryptkey = CryptoJS.enc.Utf8.parse('Thisisasamplekeythatamusinginmyc');
const cryptiv = CryptoJS.enc.Utf8.parse('thisismysampleiv')

// Decryption 
const crypted = CryptoJS.enc.Base64.parse("fdsUYHdv/5PoJSoZGwWppw==");
var decrypt = CryptoJS.AES.decrypt({ciphertext: crypted}, cryptkey, {
    iv: cryptiv,
    mode: CryptoJS.mode.CTR
});
console.log(decrypt.toString(CryptoJS.enc.Utf8));

// Encryption
var encrypt = CryptoJS.AES.encrypt("Sample Text", cryptkey, {
    iv: cryptiv,
    mode: CryptoJS.mode.CTR
});
console.log(encrypt.toString())
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>


通常,像 CTR 这样的流密码模式不使用填充。请注意,这两个库默认应用 PKCS#7 填充,并且不会针对流密码模式自动禁用它。因此,应该在两侧显式禁用填充(在 Dart 侧使用 padding: null ,在侧使用 padding: CryptoJS.pad.NoPadding CryptoJS 端)。
或者,双方都可以使用 CBC 等分组密码模式。然后,必须应用填充(例如 PKCS#7)。

如果在测试之外使用静态 IV 和 key 密码:那么,出于安全原因,应应用 key 派生函数,例如 PBKDF2。此外,对于每次加密,都应生成一个随机 IV,该 IV 与密文(通常是串联的)一起传递到另一方。

关于flutter - 使用 flutter/dart 加密并使用 CryptoJS 解密 aes 返回空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71118337/

相关文章:

mysql - Flutter 如何从 JSON 列出具有多个子项的数组

android - 点击按钮时如何在容器上画线

dart - Dart 2 中的 const 何时是可选的?

c - 如何在 SQLite 中启用访问控制?

flutter - 消除小部件之间的间隙

dart - getter 'storeNumber'在null上被调用(接收方:null)

angular - 如何解决AngularDart “Ignoring &lt;style&gt;, as this element is unsafe to bind in a template without proper sanitization”

dart - 通过滑动更改路线

php - 如何加密 laravel 5.2 URL 或路由?

c++ - 流转换过滤器 : ciphertext length is not a multiple of block size?