首页 > 解决方案 > 解密在 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)
}

标签: androidencryptiondart

解决方案


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' ,其余需要编辑。


推荐阅读