0

I'm trying to make encryption and decryption between php and c# using AES-128-ECB I found a way to encrypt in php and decrypt in c#. the problem now i'm trying to do the opposite I'm facing problem trying to understand how c# working with Cryptography

the code I used I found it on this question PHP and C# AES256 encryption -> decryption

I'm using the same code it's easy to do it on php for decryption but my problem with c# I found this docs cryptography using rijadealManaged I coudn't understand it

c# code :

    public String Decryptions(String text, String key)
{
    //decode cipher text from base64
    byte[] cipher = Convert.FromBase64String(text);
    //get key bytes
    byte[] btkey = Encoding.ASCII.GetBytes(key);

    //init AES 128
    RijndaelManaged aes128 = new RijndaelManaged();
    aes128.Mode = CipherMode.ECB;
    aes128.Padding = PaddingMode.PKCS7;

    //decrypt
    ICryptoTransform decryptor = aes128.CreateDecryptor(btkey, null);
    MemoryStream ms = new MemoryStream(cipher);
    CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);

    byte[] plain = new byte[cipher.Length];
    int decryptcount = cs.Read(plain, 0, plain.Length);

    ms.Close();
    cs.Close();

    //return plaintext in String
    return Encoding.UTF8.GetString(plain, 0, decryptcount);
}

php code :

function encryption($json) {
$encrypted= '';
$plaintext = $json;
$cipher = 'AES-128-ECB';

$key = '1234567891123456';

$encrypted = openssl_encrypt($plaintext, $cipher, $key, 0);

return $encrypted;
echo $encrypted;
}

UPDATE :

tried this code from answers :



  public  string Encryption(string text,string key,string privatekey)
        {
              byte[] inputtextbyteArray = System.Text.Encoding.UTF8.GetBytes(text);
              using RijndaelManaged aes128 = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
              using var memstr = new MemoryStream();
              using var crystr = new CryptoStream(memstr, aes128.CreateDecryptor(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(privatekey)), CryptoStreamMode.Write);
              crystr.Write(inputtextbyteArray, 0, inputtextbyteArray.Length);
                return Convert.ToBase64String(memstr.ToArray());

        }
        public string Decryption(string base64, string key, string privatekey)
        {
            try
            {
            
                byte[] inputtextbyteArray =  Convert.FromBase64String(base64.Replace(" ", "+"));
                using RijndaelManaged aes128 = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
                using var memstr = new MemoryStream();
                using var crystr = new CryptoStream(memstr, aes128.CreateDecryptor(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(privatekey)), CryptoStreamMode.Write);
                crystr.Write(inputtextbyteArray, 0, inputtextbyteArray.Length);
                return Encoding.UTF8.GetString(memstr.ToArray());
            }
            catch (Exception ex)
            {
                throw new Exception("LOL NO HACKING!");
            }
        }

I understand how code work but the Errors I'm getting confusing : enter image description here

ALQAWSI
  • 21
  • 6
  • **I coudn't [couldn't] understand it** - which part of the C# code / RijndaelManaged class you cannot understand ? – Ken Lee Nov 05 '22 at 04:25
  • @KenLee the part how byte[] works with encryption, I fully understand php and only i need to make is variables and sign data to it, but in c# when I'm dealing with type of byte[] I really got confused and had a lot of errors because I can't make conversion right. – ALQAWSI Nov 05 '22 at 04:39

1 Answers1

0
  public  string Encryption(string text,string key,string privatekey)
        {
              byte[] inputtextbyteArray = System.Text.Encoding.UTF8.GetBytes(text);
              using RijndaelManaged aes128 = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
              using var memstr = new MemoryStream();
              using var crystr = new CryptoStream(memstr, aes128.CreateDecryptor(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(privatekey)), CryptoStreamMode.Write);
              crystr.Write(inputtextbyteArray, 0, inputtextbyteArray.Length);
                return Convert.ToBase64String(memstr.ToArray());

        }
        public string Decryption(string base64, string key, string privatekey)
        {
            try
            {
            
                byte[] inputtextbyteArray =  Convert.FromBase64String(base64.Replace(" ", "+"));
                using RijndaelManaged aes128 = new RijndaelManaged { Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 };
                using var memstr = new MemoryStream();
                using var crystr = new CryptoStream(memstr, aes128.CreateDecryptor(Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(privatekey)), CryptoStreamMode.Write);
                crystr.Write(inputtextbyteArray, 0, inputtextbyteArray.Length);
                return Encoding.UTF8.GetString(memstr.ToArray());
            }
            catch (Exception ex)
            {
                throw new Exception("LOL NO HACKING!");
            }
        }

I didn't test it

remeber by use "using" you dont need to use ms.Close();

And aes128.CreateDecryptor(btkey, null); why you use null

just make a private key

and btw i just choice "key" in my code but easy to call it chiper