Has anyone worked with Rijndael encryption on Flutter? How to encrypt with Rijndael?

754 Views Asked by At

I am using the encrypt Flutter package. I wrote the code below to encrypt data. But I could not find the expected result.

  String encrypterAESdata({String? data}){ 
    final key = Key.fromUtf8(aesKey);
    final iv = IV.fromUtf8(aesKey);
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: "PKCS7" ));
    final encrypted = encrypter.encrypt(data!, iv: iv);
    return encrypted.base64;
  }

Test Data:

{
  "remittanceNoPrefix": "IT",
  "adjustedDCAmount": 0,
  "beneAccNo": "01912163589",
  "benePhone": "01912163589",
  "beneAccTypeID": 199,
  "beneAmount": "4900",
  "beneBankName": "BKASH (MOBILE ACCOUNT)",
  "beneBankBranchID": 31637,
  "beneBankID": 1135,
  "beneBranchName": "BKASH (ANY AGENT POINT)",
  "beneBrnAddress": "ANYWHERE",
  "beneCountryID": 23,
  "beneCurrencyID": 15,
  "beneDocID": null,
  "beneDocNo": "",
  "beneficiaryID": 497656,
  "beneficiarySurname": "TEST",
  "beneficiaryName": "TEST",
  "relationID": null,
  "benePayeeModeID": 11,
  "subCompanyBranchID": 151886,
  "companyID": 76,
  "subCompanyID": 367,
  "debitCardID": null,
  "discountedComm": 0,
  "encashedPoint": 0,
  "encashedPointAmount": 0,
  "equiAmount": 50,
  "ofrdAmount": 50,
  "equiCommission": 3,
  "ofrdCommission": 3,
  "taxAmount": 0,
  "cardCharge": 0,
  "instrumentDetail": "",
  "instrumentTypeID": "120",
  "maturityDate": "2019-02-14T00:00:00.000Z",
  "issueDate": "2019-02-14T00:00:00.000Z",
  "othrRcvdAmount": 0,
  "othrRcvdCommission": 0,
  "pDRate": 98,
  "purposeDetail": "FAMILY HELP",
  "purposeID": 2,
  "aMLRemBhvClsID": null,
  "aMLRemBhvClsValue": 0,
  "aMLOpVoteClsID": null,
  "aMLOpVoteClsValue": 0,
  "aMLCoopClsID": null,
  "aMLCoopClsValue": 0,
  "aMLOpTypeClsID": null,
  "aMLOpTypeClsValue": 0,
  "fldPsfx": "",
  "cdType": "BNKXFR",
  "cdNo": "",
  "cdExp": "",
  "cdSecCode": ""
}

Expected Result:

/qDmHF87PF/E6Bmwiot9roUrXwEvykmHzCLMbKq2YnVUuHDGqXqMWlJ8ZhCzMBcqppkpvjY6NkN8bUUp0fYZz1Pl6I5E/qtIaxbvrMOU+wRDpLvV1Ymd+o+J1fe0PLAmC5SUXsj1MyRCPG0LJ1cRjHR7F4HnWJZoGOCmeh3nZrzGSkdVQ3Xya8c8eK0RiAkcgUABpwptY77yknR1WNEV6HoOnOxdPt6vo/D0oba17jp5coonFCcVUsmZ3PacRmCzVuhbvqaFJgCoykBZOkzsSUgl792F1QP9995q/S/hmFJZv2JHyNKeOGLJ55uMSVHYTPOvqgAn7VZ2CkiTBQSaDJpWzLF/3HpQR9jjgY3n5cOGqJyPbWiLz0N4jWeOJ6TUnyBd8K5PhtOY8C+uh5GkeyAWrieEFbX1Q5pytaUKcqDBTOWjF3945ImVSoviZYHDaPgJ8f/1V3FuAdH3VM+zpzlBAmVwtcjfZZzfzdDSOUgYeU98P+JjWfqX8bQu5vXBSCnkMqEENyM85z9ISoi+oYKnsYNt6sPKOf2lVIxj+9vA9G1+fCfNTH1a7Tg2yszSHA3yTNy1QLTqQY9fCS0A/vIgJPjHYJPjjLNK4CA0L1mZje8Rkh9eha8BD61/6YPAJFAfiU6eNK8uC5gToMSdOTt2auj2i3yuPx8sLyTBe8MOI3TOCoE/xC2yqCUxuUqH1ppn2TKlNjULy2ChiJG5o3cTC6b7trAaNzn+B8220TkaM1+k5RDvELd6+GcxdteO43oECs2eoXYF28z+V/kGHAhQeBBMKEF5sAaD3Qnq+IX4uHOjc6ngu41IbKnvrMaDL+o1qjfrLILQAPgYYHSzzp/C7Ov1Yzym0bR8dp7g+ATFj+1sgNOQWyzVr7v74stncu0aREBPJFTn1SkoajFJ2XD40+65IHw6ZKxfeXT2ArKueZrXPFYI/j5FW1jVfyM66FW6prmJ33PfadQ1OLMRS84FKhv3xfXP20hca/mMDXWzVOfhMDhPQRx0txL6Qh6AqS984UgM6CTcWIGL7UC7UMDtEYrcsLOw0y7LR0vD0acH+d4NESC7AzyDaN4//otzaYyOeNvYCraDWx0DpPyJCQfQSQKctzELHWgcb8hHgMup42ewu4+cMml42eTwVjrbKAYcSTYeimb0aVa9LlObOoUBFBrudzhhyXueYd1+RK83k8BuCyxo9jsk7oDlsngm4j8HdOvp2TJm4gFs1wTDR4lQmuqVNMdorJT6iO7f/tEuOMTb6lXueM7XWDlQ9vbUYDlG8py9K3Tfd6cPny2L7uzdCk2OnnmEpYmVM3nzhgY1wYz/TwS3sWAYriRDJ1WhXKoCWC7iXn+rKq1QwctxatFiz14zYtU41ucXFM0uiU76jPYQ8q3UsGHMvoL7pbAii4qW05QEcDuGjI/kJgtTf8KWZz+tk7ii3nnh+nrh//1hiC8sC1GJ7/PIdvPj4yXWv0wG8XONfl43MIRTD1n43ePkNQaYyeGFmcZc+BJjPTZ6Z7KZjACbaeS8YZlAE8EAOVGNzq4oZFpFt/+VJcMIa17LtCrjTqcDuDFggjO633Z3ISLnAZJeYoaXtFWaehdZVCimTh0xCnON63jlmyrZoL38cCqFfBiEcJ4O04Pfqob6FEhgTEk4vhQLV7n/O4LhsR9yyfnipY2IrZHVOIGYDJfnw3D4NrpKjBRxq2q/ihTLYzQCpmyXaFVNmgIsv37fdgk2TYZ6leyVs+jDdUwogluqzbTEGOOqK4ZqvLgntEYEFjGEP4Ztjwu48BuLvsT2vH/zuKMW5L0WtZYn6Ytq2sFDJ2aoFSWvUwnz4w5lrrD1dmOOJJGpnn3aNAWcwx5DZk7tCFOp0D6zGtajLM7pMA==

Key:

**********

IV:

*********
2

There are 2 best solutions below

0
Richard Heap On BEST ANSWER

I never find the 'wrapper' packages around pointcastle useful. They just add layers of obfuscation in the name of adding 'simplicity'. It's often easier to just use the underlying package directly.

import 'dart:convert';
import 'dart:typed_data';

import 'package:pointycastle/export.dart';

void main() {
  final k = 'Nec_uK_2@!6_CebD';
  final key = utf8.encode(k) as Uint8List;
  final iv = key;

  print(key);

  final cipher = PaddedBlockCipherImpl(
    PKCS7Padding(),
    CBCBlockCipher(AESEngine()),
  )..init(
      true,
      PaddedBlockCipherParameters(
        ParametersWithIV(KeyParameter(key), iv),
        null,
      ),
    );

  final data = utf8.encode(pt) as Uint8List;
  final ct = cipher.process(data);

  print(data.length);
  print(ct.length);
  print(base64.encode(ct));
}

final pt = '''{
  "remittanceNoPrefix": "IT",
  "adjustedDCAmount": 0,
  ...
  "cdExp": "",
  "cdSecCode": ""
}''';
0
mister_cool_beans On

easy peasy

import 'package:cryptography/cryptography.dart';

String s = "i want to encrypt this init";

String key = 'AA­èìýUn}a…ópŒ¹%J'yL4ßK,£½';

List<int> listint= utf8.encode(s);

Uint8List listUint= Uint8List.fromList(key.codeUnits);


AesGcm algorithm = AesGcm.with256bits();

SecretKey secretKey = await algorithm.newSecretKeyFromBytes(listUint);


    SecretBox secretBox = await algorithm.encrypt(
      listint,
      secretKey: secretKey,
    );

    print('Nonce: ${secretBox.nonce}');
    print('Ciphertext: ${secretBox.cipherText}');
    print('MAC: ${secretBox.mac.bytes}');


    Uint8List listEncryptedUint = secretBox.concatenation();
    print('this is the encrypted payload init: '+listEncryptedUint .toString());