Flutter 使用Dart加密AES/CBC/PKCS7填充(适用于Kotlin)
我是Dart的新手,我正在尝试重写我的kotlin Loginda加密。 我尝试使用包:encrypt/encrypt.dart执行此操作 在下面,您可以找到我的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
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;
}