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