skip to Main Content

I have an encryption function in C# and i wish to copy it to dart:

C# (The part of code i cant reproduce in dart):

private RijndaelManaged myRijndael = new RijndaelManaged();
public ClsCrypto(string strPlainText)
{
string strIV = "$@A@B@_3CP$Y$T2M";

myRijndael.IV = Encoding.UTF8.GetBytes(strIV);
myRijndael.Key = Encoding.UTF8.GetBytes("$@J@Y@3NT3RPRI$3R3$OURC3PL@NNING");
byte[] originalBytes = new System.Text.UTF8Encoding().GetBytes(strPlainText);

ICryptoTransform transform = myRijndael.CreateEncryptor();
byte[] encryptedText = transform.TransformFinalBlock(originalBytes, 0, originalB
ytes.Length);
return Convert.ToBase64String(encryptedText);
}

I couldn’t find resources on the web, I used the "encrypt.dart" package to do this:

    final key = Key.fromUtf8("$@J@Y@3NT3RPRI$3R3$OURC3PL@NNING");
    final iv = IV.fromUtf8("$@A@B@_3CP$Y$T2M");

    final encrypter = Encrypter(AES(key));
    final encrypted = encrypter.encrypt(plainText, iv: iv);

but I couldn’t get the same encryption.

My code and result :

 String strIV = "$@J@Y@_3RP$Y$T3M";
    final plainText = 'CCCC-1111-CCCC-2222-CCCC-3333-CCCC';
    final key = Key.fromUtf8(String.fromCharCodes(utf8.encode("$@J@Y@3NT3RPRI$3R3$OURC3PL@NNING")));
    final iv = IV.fromUtf8(String.fromCharCodes(utf8.encode(strIV)));

    final encrypter = Encrypter(AES(key));
    final encrypted = encrypter.encrypt(plainText, iv: iv);
    print("encrypted : ${encrypted.base64}");

result :
encrypted :

UwQqA5DjJ7xO3POMpmyQZxINEGDM9ImcEgrC5M8pF2hiFy4CkCrbY6QBdM7EbbuR

C#:

using System;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp3
{

public class ClsCrypto
{ 
private RijndaelManaged myRijndael = new RijndaelManaged();

public static void Main(){
        ClsCrypto cs = new ClsCrypto("$@J@Y@_3RP$Y$T3M");
         cs.Encrypt("CCCC-1111-CCCC-2222-CCCC-3333-CCCC");
        }
public ClsCrypto(string strIV)
{
}
public void Encrypt(string strPlainText)
{
String strIV = "$@J@Y@_3RP$Y$T3M"; //Default IV
myRijndael.IV = Encoding.UTF8.GetBytes(strIV);
myRijndael.Key = Encoding.UTF8.GetBytes("$@J@Y@3NT3RPRI$3R3$OURC3PL@NNING");
byte[] originalBytes = new System.Text.UTF8Encoding().GetBytes(strPlainText);
ICryptoTransform transform = myRijndael.CreateEncryptor();
byte[] encryptedText = transform.TransformFinalBlock(originalBytes, 0, originalBytes.Length);
//return Convert.ToBase64String(encryptedText);
Console.WriteLine(Convert.ToBase64String(encryptedText));
}
}
}

result :

26CxCs5A7c7Sk5+0/hQ300vkHsCuRPXyACbrcRxyeCBWwAK9TCOLdkDHvBaLJXYH

2

Answers


  1. I’m not an expert of cryptography, but in dart there is the pointy castle
    package that is the porting of Bouncy Castle in dart.
    AES algorithm is there.

    Then take a look at: encrypt
    that is a simple wrapper on poiny castle, its scope is to simplify it.

    Login or Signup to reply.
  2. As I already mentioned in the comment, the encrypt package uses SIC aka CTR as the default mode (s. encrypt 5.0.3, sec. Usage – Modes of operation), while in the C# code CBC is applied (by default).
    Since the C# code is the reference, CBC must also be used in the Dart code so that both codes are compatible. This requires the following change:

    final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
    

    With this, both codes for the same plaintext, key and IV generate the same ciphertext.


    Security:
    The use of a static IV is a vulnerability (better: apply a randomly generated IV).
    In addition, the UTF-8 encoding of the key indicates a passphrase, which is also a vulnerability due to the generally low entropy (better: use a key derivation function in conjunction with a randomly generated salt to derive a key from the passphrase).
    Salt and IV are not secret and are passed to the decrypting side along with the ciphertext (usually concatenated).
    With regard to the C# code, also be aware that RijndaelManaged is obsolete.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search