1

I'm trying to decrypt an AES256 bit but it gives me this error "Length of the data to decrypt is invalid." On line Plain_Text = Stream_Read.ReadToEnd();. My encryption method works but the decrypt doesn't. Could someone help me? Thankyou.

 private static string Decrypt(string stringCypher_Text, string stringKey, string stringIV)
    {
        //Hashes, and converts key to bytes
        //hash
        //convert
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        Byte[] Key = encoding.GetBytes(stringKey);

        //converts string IV to bytes
        Byte[] IV = encoding.GetBytes(stringIV);

        //converts cypher string to bytes
        Byte[] Cypher_Text = encoding.GetBytes(stringCypher_Text);

        RijndaelManaged Crypto = null;
        MemoryStream MemStream = null;
        ICryptoTransform Decryptor = null;
        CryptoStream Crypto_Stream = null;
        StreamReader Stream_Read = null;
        string Plain_Text;

        try
        {
            Crypto = new RijndaelManaged();
            Crypto.Key = Key;
            Crypto.IV = IV;

            MemStream = new MemoryStream(Cypher_Text);

            //Create Decryptor make sure if you are decrypting that this is here and you did not copy paste encryptor.
            Decryptor = Crypto.CreateDecryptor(Crypto.Key, Crypto.IV);

            //This is different from the encryption look at the mode make sure you are reading from the stream.
            Crypto_Stream = new CryptoStream(MemStream, Decryptor, CryptoStreamMode.Read);

            //I used the stream reader here because the ReadToEnd method is easy and because it return a string, also easy.
            Stream_Read = new StreamReader(Crypto_Stream);
            Plain_Text = Stream_Read.ReadToEnd();

        }
        finally
        {
            if (Crypto != null)
                Crypto.Clear();

            MemStream.Flush();
            MemStream.Close();

        }
        return Plain_Text;

    }
4

2 回答 2

1

The problem is in your Encrypt method or more exactly in the interaction between Encrypt and Decrypt. You really don't want to use UTF8Encoding or ANY encoding for binary data. Text encodings are used to turn text into binary data and back again. Encrypted text is actually purely binary data. What I would suggest is using Base64Strings.

In your Encrypt method you most likely have a MemoryStream that you are returning encoded characters from. Instead return a Base64String like this...

string cipherText = Convert.ToBase64String(memoryStream.ToArray());
return cipherText;

Then in your Decrypt you take that cipherText and turn it back into a Byte[] like this...

Byte[] Cypher_Text = Convert.FromBase64String(stringCypher_Text);

You should also pass your key and initialization vector as Base64Strings as well and after that your code should be good to go.

于 2013-05-16T00:47:40.287 回答
0

Try changing Plain_Text = Steam_Read.ReadToEnd(); to

  byte[] plainText = new byte[Plain_Text.Length];
  int dByte = Stream_Read.Read(plainText, 0, plainText.Length);
  string decryptedText = Encoding.UTF8.GetString(plainText, 0, dByte);
  return descryptedText;
于 2013-05-16T00:44:59.120 回答