You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动