Search code examples
flutterdartencryptionrijndael

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


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:

*********

Solution

  • 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": ""
    }''';