How to encrypt and decrypt using AES CBC 256bit and PKCS5Padding in dart and also retrieve parameters How to encrypt and decrypt using AES CBC 256bit and PKCS5Padding in dart and also retrieve parameters dart dart

How to encrypt and decrypt using AES CBC 256bit and PKCS5Padding in dart and also retrieve parameters


Here's a working example of encode in Java, decode in pointycastle.

Java

String plainText = "Hello World!";KeyGenerator generator = KeyGenerator.getInstance("AES");generator.init(256);SecretKey secret = generator.generateKey();Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secret);byte[] encodedData = cipher.doFinal(Base64.getEncoder().encode(plainText.getBytes(StandardCharsets.UTF_8)));Base64.Encoder encoder = Base64.getEncoder();System.out.println(encoder.encodeToString(secret.getEncoded()));System.out.println(encoder.encodeToString(cipher.getParameters().getEncoded())); // the DER encoded IVSystem.out.println(encoder.encodeToString(encodedData));

Dart

import 'dart:convert';import 'dart:typed_data';import 'package:pointycastle/export.dart';void main() {  // the following 3 values were output from the above Java code  var key = base64.decode('9JYmap3xB79oyBkY6ZIdJCXaOr/CurCK8XUsRZL9XXI=');  var params = base64.decode('BBChkSMIq/v35PRRWAJGwtTr');  var cipherText =      base64.decode('Dh+lg2IMzcLC0toDRSoNMAQoR7MWKMLMPRi7KtdQdmw=');  var iv = params.sublist(2); // strip the 4, 16 DER header  var cipher = PaddedBlockCipherImpl(    PKCS7Padding(),    CBCBlockCipher(AESFastEngine()),  );  cipher.init(    false /*decrypt*/,    PaddedBlockCipherParameters<CipherParameters, CipherParameters>(      ParametersWithIV<KeyParameter>(KeyParameter(key), iv),      null,    ),  );  var plainishText = cipher.process(cipherText);  print(utf8.decode(base64.decode(utf8.decode(plainishText))));}

Encrypting in Dart

  var key = Uint8List(32); // the 256 bit key  var plainText = 'Ciao Mondo';  var random = Random.secure();  var params = Uint8List(18)    ..[0] = 4    ..[1] = 16;  for (int i = 2; i < 18; i++) {    params[i] = random.nextInt(256);  }  var iv = params.sublist(2);  var cipher = PaddedBlockCipherImpl(    PKCS7Padding(),    CBCBlockCipher(AESFastEngine()),  )..init(      true /*encrypt*/,      PaddedBlockCipherParameters<CipherParameters, CipherParameters>(        ParametersWithIV<KeyParameter>(KeyParameter(key), iv),        null,      ),    );  var plainBytes = utf8.encode(base64.encode(utf8.encode(plainText)));  var cipherText = cipher.process(plainBytes);  // cipherText is the cipher text  // params is the Java compatible params