Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 使用Dart加密AES/CBC/PKCS7填充(适用于Kotlin)_Flutter_Kotlin_Dart_Encryption - Fatal编程技术网

Flutter 使用Dart加密AES/CBC/PKCS7填充(适用于Kotlin)

Flutter 使用Dart加密AES/CBC/PKCS7填充(适用于Kotlin),flutter,kotlin,dart,encryption,Flutter,Kotlin,Dart,Encryption,我是Dart的新手,我正在尝试重写我的kotlin Loginda加密。 我尝试使用包:encrypt/encrypt.dart执行此操作 在下面,您可以找到我的kotlin代码,该代码有效: data class LoginData( val login: String, val password: String ) 使用以下代码完成: final encryptedLoginda=encrypter.encrypt(json,iv:iv).base64; 最终编码=base

我是Dart的新手,我正在尝试重写我的kotlin Loginda加密。 我尝试使用包:encrypt/encrypt.dart执行此操作

在下面,您可以找到我的kotlin代码,该代码有效:

data class LoginData(
    val login: String,
    val password: String
)
使用以下代码完成: final encryptedLoginda=encrypter.encrypt(json,iv:iv).base64; 最终编码=base64.encode(utf8.encode(encryptedLoginData))

我建议您使用:

dependencies:
  pointycastle: ^2.0.0
  encrypt: ^4.1.0
下面介绍两种加密/解密普通消息的简单方法:

  String encrypt(String plainText) {
    final key = Key.fromUtf8(password);
    final iv = IV.fromLength(16);
    final encrypter = Encrypter(AES(key));
    final encrypted = encrypter.encrypt(plainText, iv: iv);
    return encrypted.base64;
  }

  String decrypt(String encrypted) {
    final key = Key.fromUtf8(password);
    final iv = IV.fromLength(16);
    final encrypter = Encrypter(AES(key));
    final decrypted = encrypter.decrypt64(encrypted, iv: iv);
    return decrypted;
  }

谢谢你的回复。我的私钥类似于“ksjdg*&%\$dfgh\”{#@!vcfkslc、.a/dcfxcsw345654Gfdsgtrasd;fsdjf]}{O0 xfvbgasdh=“当我使用您的方法时,我得到错误:无效参数:密钥长度必须是128/192/256位。我无法更改此密钥。下面您可以看到我在Kotlin中是如何做到的:val secretKeySpec=secretKeySpec(Constants.private\u key.toByteArray(),0,32,“AES”)尝试以下操作:final encrypter=encrypter(AES(key,mode:AESMode.cbc));我手动从私钥中删除了过多的字符(当前为32个字符)它在android上仍然可以工作。问题是我在android上的加密是90个字符,在Flatter上的加密是64个字符。我认为这是base64编码的问题。下面你可以看到我在android上加密的操作:val encryptedLoginDataBase64Encoded=String(base64.encode(encryptedLoginData.toByteArray(),默认缓冲区大小),Charset.defaultCharset())我做到了!final encryptedLoginData=encrypter.encrypt(json,iv:iv.base64;final encoded=base64.encode(utf8.encode(encryptedLoginData));如何导入库来运行上面的Kotlin代码?我已经尝试了多次迭代实现(通过build.gradle)并在脚本中导入。我尝试过的都不管用。
    private fun generateIv(): ByteArray {
        val iv = ByteArray(16)
        SecureRandom().nextBytes(iv)
        return iv
    }
    private fun initCipher(iv: ByteArray): Cipher {
        val cipher: Cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
        val secretKeySpec = SecretKeySpec(Constants.PRIVATE_KEY.toByteArray(), 0, 32, "AES")
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, IvParameterSpec(iv))
        return cipher
    }
    private fun encrypt(stringToEncrypt: String, iv: ByteArray): String {
        val encrypted: ByteArray =
            initCipher(iv).doFinal(stringToEncrypt.toByteArray(Charsets.UTF_8))
        return String(Base64.encode(encrypted, DEFAULT_BUFFER_SIZE))
    }
dependencies:
  pointycastle: ^2.0.0
  encrypt: ^4.1.0
  String encrypt(String plainText) {
    final key = Key.fromUtf8(password);
    final iv = IV.fromLength(16);
    final encrypter = Encrypter(AES(key));
    final encrypted = encrypter.encrypt(plainText, iv: iv);
    return encrypted.base64;
  }

  String decrypt(String encrypted) {
    final key = Key.fromUtf8(password);
    final iv = IV.fromLength(16);
    final encrypter = Encrypter(AES(key));
    final decrypted = encrypter.decrypt64(encrypted, iv: iv);
    return decrypted;
  }