android - 解密在 Android 中加密的 Dart 中的文本
问题描述
我正在尝试解密我在 Android 中编码的 Dart 中的字符串。我已经尝试了所有我能想到的在 dart 上使用 encrypt 包的方法,但事情似乎没有奏效。
这是安卓代码:
fun String.encrypt(): String {
fun getByteBuffer(crypt: ByteArray, iv: ByteArray): ByteArray {
val byteBuffer = ByteBuffer.allocate(4 + iv.size + crypt.size)
byteBuffer.putInt(iv.size)
byteBuffer.put(iv)
byteBuffer.put(crypt)
return byteBuffer.array()
}
val key = EncryptionExtension.encryptionKey.toByteArray()
val iv = ByteArray(12)
SecureRandom().apply { nextBytes(iv) }
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, SecretKeySpec(key, "AES"), GCMParameterSpec(128, iv))
return Base64.encodeToString(getByteBuffer(cipher.doFinal(this.toByteArray(Charsets.UTF_8)), iv), Base64.DEFAULT)
}
解决方案
Flutter 加密包不支持 AES/GCM。尝试使用包中提到的支持模式阅读我。
import 'package:encrypt/encrypt.dart';
void main() {
final plainText = 'hello';
final key = Key.fromUtf8('this is a key');
final iv = IV.fromLength(16);
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted = encrypter.encrypt(plainText, iv: iv);
final decrypted = encrypter.decrypt(encrypted, iv: iv);
print(decrypted);
print(encrypted.base64);
}
并在您的 java 代码上将 'AES/GCM/NoPadding' 更改为 'AES/CBC/NoPadding' ,其余需要编辑。
推荐阅读
- c# - 为学士论文编写一个小型 C# 应用程序 - 我应该使用 MVC 模式吗?
- java - 我如何获得格林威治标准时间的毫秒数?
- python - 根据时间范围对 pandas df 进行子集化
- c++ - 何时需要定义类的静态数据成员 (un/-)
- java - Linux 命令在 Java 程序中无法正常工作
- javascript - 无法使用 JavaScript 从本地 XML 文件中获取值
- python - 一行中的简单“if”分支
- android - Google vision API Barcode Scanner 移除相机视图
- javascript - 如何获取单击按钮的标题属性?
- c# - LINQ 与不同对象的多个连接