1

The encryption works fine but I get the exception while decrypting the cipher text. The cipher text is generated via encrypting 'Test' Cipher text: u1jeSfKVfSRfSieLX01/uQ==

    string encrypt(string plainText)
    {
        AesManaged aesCipher = new AesManaged();
        aesCipher.KeySize = 128;
        aesCipher.BlockSize = 128;
        aesCipher.Mode = CipherMode.CBC;
        aesCipher.Padding = PaddingMode.PKCS7;
        aesCipher.Key = generatedKey();

        byte[] iv = new byte[16];
        // 15 1B 0F 03 56 3A 66 6D E5 E1 1D 83 12 21 B4 8E
        iv[0] = 0x15;
        iv[1] = 0x1B;
        iv[2] = 0x0F;
        iv[3] = 0x03;
        iv[4] = 0x56;
        iv[5] = 0x3A;
        iv[6] = 0x66;
        iv[7] = 0x6D;
        iv[8] = 0xE5;
        iv[9] = 0xE1;
        iv[10] = 0x1D;
        iv[11] = 0x83;
        iv[12] = 0x12;
        iv[13] = 0x21;
        iv[14] = 0xB4;
        iv[15] = 0x8E;

        aesCipher.IV = iv;

        byte[] b = System.Text.Encoding.UTF8.GetBytes(plainText);
        ICryptoTransform encryptTransform = aesCipher.CreateEncryptor();
        byte[] ctext = encryptTransform.TransformFinalBlock(b, 0, b.Length);

        System.Console.WriteLine("IV:" + Convert.ToBase64String(aesCipher.IV));
        System.Console.WriteLine("Cipher text: " + Convert.ToBase64String(ctext));
        return Convert.ToBase64String(ctext);
    }
    string decrypt(String CipherText)
    {
        AesManaged aesCipher = new AesManaged();
        aesCipher.KeySize = 128;
        aesCipher.BlockSize = 128;

        aesCipher.Mode = CipherMode.CBC;
        aesCipher.Padding = PaddingMode.PKCS7;
        byte[] key = generatedKey();
        aesCipher.Key = key;

        byte[] iv = new byte[16];
        // 15 1B 0F 03 56 3A 66 6D E5 E1 1D 83 12 21 B4 8E
        iv[0] = 0x15;
        iv[1] = 0x1B;
        iv[2] = 0x0F;
        iv[3] = 0x03;
        iv[4] = 0x56;
        iv[5] = 0x3A;
        iv[6] = 0x66;
        iv[7] = 0x6D;
        iv[8] = 0xE5;
        iv[9] = 0xE1;
        iv[10] = 0x1D;
        iv[11] = 0x83;
        iv[12] = 0x12;
        iv[13] = 0x21;
        iv[14] = 0xB4;
        iv[15] = 0x8E;

        aesCipher.IV = iv;
        System.Console.WriteLine("IV:" + Convert.ToBase64String(aesCipher.IV));
        // aesCipher.IV = new Ini

        ICryptoTransform decryptTransform = aesCipher.CreateDecryptor(aesCipher.key, aesCipher.IV);
        byte[] plainText = decryptTransform.TransformFinalBlock(Encoding.ASCII.GetBytes(CipherText), 0, CipherText.Length);
        return System.Text.Encoding.UTF8.GetString(plainText);
    }
    byte[] generatedKey()
    {
        // byte[] salt = new byte[] { 172, 137, 25, 56, 156, 100, 136, 211, 84, 67, 96, 10, 24, 111, 112, 137, 3 };
        byte[] salt = new byte[17];
        // AC 89 19 38 9C 64 88 D3 54 43 60 0A 18 6F 70 89 03
        salt[0] = 0xAC;
        salt[1] = 0x89;
        salt[2] = 0x19;
        salt[3] = 0x38;
        salt[4] = 0x9C;
        salt[5] = 0x64;
        salt[6] = 0x88;
        salt[7] = 0xD3;
        salt[8] = 0x54;
        salt[9] = 0x43;
        salt[10] = 0x60;
        salt[11] = 0x0A;
        salt[12] = 0x18;
        salt[13] = 0x6F;
        salt[14] = 0x70;
        salt[15] = 0x89;
        salt[16] = 0x03;


        int iterations = 1024;
        var rfc2898 = new System.Security.Cryptography.Rfc2898DeriveBytes("!CarIT.123#2017", salt, iterations);
        byte[] key = rfc2898.GetBytes(16);
        String keyB64 = Convert.ToBase64String(key);
        System.Console.WriteLine("Key: " + keyB64);
        return key;
    }

I also tried using byte[] plainText = decryptTransform.TransformFinalBlock(Convert.FromBase64String(CipherText), 0, CipherText.Length); instead of byte[] plainText = decryptTransform.TransformFinalBlock(Encoding.ASCII.GetBytes(CipherText), 0, CipherText.Length); But I get error "Value was invalid" on the same line.

  • Does this answer your question? [System.Security.Cryptography.CryptographicException: 'Length of the data to decrypt is invalid.' String double spaces](https://stackoverflow.com/questions/45815111/system-security-cryptography-cryptographicexception-length-of-the-data-to-decr) – jazb Jul 26 '22 at 06:00

1 Answers1

0

My bad,

byte[] plainText = decryptTransform.TransformFinalBlock(Encoding.ASCII.GetBytes(CipherText), 0, CipherText.Length);

should be like

byte[] plainText = decryptTransform.TransformFinalBlock(Encoding.ASCII.GetBytes(CipherText), 0, Encoding.ASCII.GetBytes(CipherText).Length);

Now it works fine, I have passed bytes as first paramter in TransformFinalBlock() and then get the length of plain text in third parameter which was wrong.

Jeremy Caney
  • 7,102
  • 69
  • 48
  • 77
  • 1
    This does not fix the problem in the posted code. There the ciphertext is Base64 encoded when encrypting, while you ASCII encode when decrypting. Btw, an ASCII encoding (like most charset encodings) generally does not work for ciphertexts and corrupts the data (unlike a binary-to-text encoding like Base64). Also: A static IV and salt are insecure. – Topaco Jul 26 '22 at 06:27