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" <cduden@hotmail.com> wrote in message
news:uQEHlrkTDHA.2188@TK2MSFTNGP10.phx.gbl...
> 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
>
>