Drashyr
Drashyr

Reputation: 2675

Encrypt AES/CBC/PKCS7Padding with Dart (works on Kotlin)

I'm new in Dart and I'm trying to rewrite my kotlin LoginData encryption. I tried to do this with package:encrypt/encrypt.dart

Below you can find my kotlin code which works:

data class LoginData(
    val login: String,
    val password: String
)
data class LoginBody(
    val encrypted: String,
    val publicToken: String
)
    fun encryptLoginData(loginData: LoginData): LoginBody {
        val jsonLoginData: String = Gson().toJson(loginData)

        val iv: ByteArray = generateIv()
        val publicToken =
            String(Base64.encode(iv, DEFAULT_BUFFER_SIZE), StandardCharsets.UTF_8)

        val encryptedLoginData: String = encrypt(jsonLoginData, iv)
        val encryptedLoginDataBase64Encoded =
            String(
                Base64.encode(encryptedLoginData.toByteArray(), DEFAULT_BUFFER_SIZE),
                Charset.defaultCharset()
            )

        return LoginBody(encryptedLoginDataBase64Encoded, publicToken)
    }
    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))
    }

DONE WITH FOLLOWING CODE: final encryptedLoginData = encrypter.encrypt(json, iv: iv).base64; final encoded = base64.encode(utf8.encode(encryptedLoginData));

Upvotes: 0

Views: 1212

Answers (1)

Mike
Mike

Reputation: 499

I suggest you to use:

dependencies:
  pointycastle: ^2.0.0
  encrypt: ^4.1.0

Here after two simple methods to encrypt/decrypt a plain message:

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

Upvotes: 1

Related Questions