解密在Android中加密的Dart中的文本

时间:2019-09-12 00:40:07

标签: android encryption dart

我正在尝试用我在Android中编码的Dart解密字符串。我已经尝试过所有可以想到的在dart上使用加密包的尝试,但似乎无法正常工作。

这是android代码:

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)
}

1 个答案:

答案 0 :(得分:0)

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”,其余部分需要修改。