Flutter跨设备字符串加解密问题:手动导入密文解密失败
解决Flutter encrypt包跨设备解密失败的问题
兄弟,你这个问题的核心其实很简单——你在两台设备上用的AES密钥(Key)和初始化向量(IV)根本不是同一个!
问题根源
你当前代码里的Key.fromLength(16)和IV.fromLength(8)这两个方法,每次调用都会随机生成新的密钥和初始化向量。设备1加密用的是一套随机值,设备2解密又生成了另一套完全不同的随机值,AES是对称加密算法,密钥和IV不匹配的话,肯定解不出正确内容。
解决步骤
要实现跨设备解密,必须保证两台设备使用完全相同的Key、IV和密文,具体操作如下:
1. 设备1:导出Key、IV和密文的Base64字符串
加密完成后,不要只输出密文,还要把生成的Key和IV转换成Base64格式的字符串(方便传输和手动输入):
var rng = Random(); var rnd = rng.nextInt(100); final plainText = 'static_name$rnd'; // 生成密钥和IV final key = Key.fromLength(16); final iv = IV.fromLength(8); // 加密 final encrypter = Encrypter(AES(key)); final encrypted = encrypter.encrypt(plainText, iv: iv); // 导出可传输的字符串 print('密文(Base64):${encrypted.base64}'); print('密钥(Base64):${key.base64}'); print('IV(Base64):${iv.base64}');
把这三个字符串记录下来,用于设备2的解密操作。
2. 设备2:导入Key、IV和密文进行解密
用设备1导出的Base64字符串还原Key、IV和密文,再执行解密:
// 手动输入从设备1获取的三个字符串 final encryptedStr = '这里填设备1输出的密文Base64'; final keyStr = '这里填设备1输出的密钥Base64'; final ivStr = '这里填设备1输出的IVBase64'; // 还原Key、IV和密文对象 final key = Key.fromBase64(keyStr); final iv = IV.fromBase64(ivStr); final encrypted = Encrypted.fromBase64(encryptedStr); // 解密 final encrypter = Encrypter(AES(key)); final decrypted = encrypter.decrypt(encrypted, iv: iv); print('解密结果:$decrypted');
关键注意事项
- 确保手动输入的三个字符串完全一致,不要有多余的空格、换行或拼写错误,Base64字符串的大小写和符号都要严格匹配。
- 如果是正式项目,密钥不要明文传输或手动输入,建议通过安全的后端接口同步,避免密钥泄露。
内容的提问来源于stack exchange,提问作者Nitneuq




