Groups | Blog | Home
all groups > dotnet general > july 2003 >

dotnet general : TripleDES encryption problem


c duden
7/19/2003 4:20:14 PM
I am attempting to encrypt some text and be able to decrypt it at a later
time. I have two methods to do this:

public static Byte[] EncryptText(string textToEncrypt, string
encryptionHash)
{
Byte[] bytearrayinput =
StringAndByteManipulation.ConvertStringToByteArray(textToEncrypt);
//DES instance
System.Security.Cryptography.TripleDESCryptoServiceProvider des = new
TripleDESCryptoServiceProvider();
// use the default SHA-1 hash algorithm
string pws = encryptionHash;
System.Security.Cryptography.PasswordDeriveBytes db = new
System.Security.Cryptography.PasswordDeriveBytes(pws,new byte[0]);
byte[] prndKey= db.GetBytes(16);
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16}; // from the example in MS
documentation.
System.IO.MemoryStream ms = new System.IO.MemoryStream();
//Create Crypto Stream that transforms text stream using Triple DES
encryption
CryptoStream cryptostream = new
CryptoStream(ms,des.CreateEncryptor(prndKey,IV),CryptoStreamMode.Write);
cryptostream.Write(bytearrayinput,0,bytearrayinput.Length);

System.IO.StreamWriter sw = new System.IO.StreamWriter(cryptostream);
sw.Write(bytearrayinput);
Byte[] mBytes = new Byte[ms.Length-1];
ms.Position = 0;
ms.Read(mBytes,0,mBytes.Length);
cryptostream.Close();
ms.Close();
return mBytes;
}

public static string DeCryptText(Byte[] textToDecrypt, string
encryptionHash)
{
Byte[] bytearrayinput = textToDecrypt;
//DES instance
System.Security.Cryptography.TripleDESCryptoServiceProvider des = new
TripleDESCryptoServiceProvider();
string pws = encryptionHash;
System.Security.Cryptography.PasswordDeriveBytes db = new
System.Security.Cryptography.PasswordDeriveBytes(pws,new byte[0]);
byte[] prndKey= db.GetBytes(16);
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytearrayinput);
//Create Crypto Stream that transforms text stream using Triple DES
encryption
CryptoStream cryptostream = new
CryptoStream(ms,des.CreateDecryptor(prndKey,IV),CryptoStreamMode.Read);
System.IO.StreamReader SR = new
System.IO.StreamReader(cryptostream,System.Text.Encoding.ASCII);
return SR.ReadToEnd();
}

I have tried this about half a hundred ways with the same results :
It chokes on
SR.ReadToEnd(); when atttepting to Decrypt the data that was encrypted by
EncryptText(..)

Length of the data to decrypt is invalid.
Description: An unhandled exception occurred during the execution of the
current web request. Please review the stack trace for more information
about the error and where it originated in the code.

Exception Details: System.Security.Cryptography.CryptographicException:
Length of the data to decrypt is invalid.


Can someone explain what is going on and what I am doing wrong. In looking
for insight into this I have seen allot of newsgroup posts where people had
the same problem but no answers.

Thanks,
CMD

c duden
7/19/2003 6:12:44 PM
Found something interesting that narrows the scope of the problem somewhat.

Here are a set of methods (one set of many I have tried):

public static byte[] DesEncrypt(byte[] data, string hashString)
{
//byte[] data = ASCIIEncoding.ASCII.GetBytes(stringToEncrypt);
byte[] m_bDESKey = ASCIIEncoding.ASCII.GetBytes(hashString);
byte[] m_bDESIV = ASCIIEncoding.ASCII.GetBytes(hashString);
MemoryStream ms = new MemoryStream(4096);
DES des = new DESCryptoServiceProvider() ;
CryptoStream encStream = new CryptoStream(ms,
des.CreateEncryptor(m_bDESKey, m_bDESIV),
CryptoStreamMode.Write);
encStream.Write(data,0,data.Length);
encStream.FlushFinalBlock();
//calculate the length of the encrypted data
byte[] bResult = new byte[ms.Position];
ms.Position = 0;
ms.Read(bResult, 0, bResult.Length) ;
encStream.Close();
return bResult;
}
public static byte[] DesDecrypt ( byte[] data, string hashString )
{
//byte[] data = ASCIIEncoding.ASCII.GetBytes(stringToDeCrypt);
byte[] m_bDESKey = ASCIIEncoding.ASCII.GetBytes(hashString);
byte[] m_bDESIV = ASCIIEncoding.ASCII.GetBytes(hashString);
MemoryStream ms = new MemoryStream(data.Length);
DES des = new DESCryptoServiceProvider() ;
CryptoStream encStream = new CryptoStream(ms,
des.CreateDecryptor(m_bDESKey, m_bDESIV),
CryptoStreamMode.Read);
ms.Write(data,0,data.Length);
ms.Position = 0;
string strResult = new StreamReader(encStream).ReadToEnd();
encStream.Close();
return ASCIIEncoding.ASCII.GetBytes(strResult);
}

Doing the following works:
byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello my friend");
byte[] encrypted =
NFS.Architecture.Security.TextEncryption.DesEncrypt(data,"password");
byte[] decrypted =
NFS.Architecture.Security.TextEncryption.DesDecrypt(encrypted,"password");

Response.Write(encrypted);
Response.Write("<BR>");
Response.Write(decrypted);

But the following Does not work:

byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello my friend");
byte[] encrypted =
NFS.Architecture.Security.TextEncryption.DesEncrypt(data,"password");
string encryptedStr = System.Text.ASCIIEncoding.ASCII.GetString(encrypted);
byte[] reencrypted = System.Text.ASCIIEncoding.ASCII.GetBytes(encryptedStr);
byte[] decrypted =
NFS.Architecture.Security.TextEncryption.DesDecrypt(reencrypted,"password");
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
Response.Write(enc.GetString(encrypted));
Response.Write("<BR>");
Response.Write(enc.GetString(decrypted));

Somehow converting the output of DesEncrypt to a string and then converting
that string back to a byte array caused the decryption method to bomb with a
"Bad Data" error.

Anyone have any ideas?


[quoted text, click to view]

c duden
7/19/2003 6:34:38 PM
Ok, I figured out a workaround -- changed everything to use UnicodeEncoding
instead of ASCIIEncoding and it now works. BUT does anyone have any insight
into why this will fail when you use ASCII encoding? I know that in C# all
strings are Unicode Byte Arrays but why would the conversion not work
correctly using the Crypto providers?

Thanks


[quoted text, click to view]

AddThis Social Bookmark Button