Home All Groups Group Topic Archive Search About

CryptographicException problem on Server 2003

Author
15 Mar 2005 9:13 PM
dingfahd
This is my first attempt at cryptography, and I'm a bit stumped.  The
following code is meant to encrypt an image on a client, then decrypt the
image on a server.  When the client and server are both running on the same
machine running Windows XP SP2 w/ .NET 1.1 the code below works.  However,
when the server code is put on a machine running Windows Server 2003,
CryptoStream.Read() throws:

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

below the code is a snippet of the end of the encrypted image.  Any help
would be greatly appreciated.

private byte[] EncryptImage(Stream ImageStream, byte[] Key,
                            byte[] IV)
{
try
{
  byte[] EncryptedImage = new byte[ImageStream.Length];
  MemoryStream encImageStream = new MemoryStream();
  RijndaelManaged rijn = new RijndaelManaged();
  ICryptoTransform trans = rijn.CreateEncryptor(Key, IV);

  CryptoStream crypt = new CryptoStream(encImageStream,
                                    trans,
                                    CryptoStreamMode.Write);
  ImageStream.Position = 0;
  byte[] rawImage = new Byte[ImageStream.Length];
  ImageStream.Read(rawImage, 0, rawImage.Length);

  crypt.Write(rawImage, 0, rawImage.Length);
  crypt.FlushFinalBlock();

  encImageStream.Position = 0;
  encImageStream.Read(EncryptedImage, 0,
                      EncryptedImage.Length);

  crypt.Close();
  ImageStream.Close();
  encImageStream.Close();

  return EncryptedImage;
}
catch(Exception ex)
{
  MessageBox.Show(ex.ToString());
  EventLog.WriteEntry("ScriptScanner",
                      ex.Message + "\n" + ex.ToString(),
                      EventLogEntryType.Error, 0, 0);
  return null;
}
}

Then decrypt the image on server side:

private byte[] DecryptImage(byte[] EncImage, byte[] Key,
                            byte[] IV)
{
try
{
  byte[] decImage = new Byte[EncImage.Length];
  MemoryStream encImageStream = new MemoryStream(EncImage);
  RijndaelManaged rijn = new RijndaelManaged();
  ICryptoTransform trans = rijn.CreateDecryptor(Key, IV);
  CryptoStream crypt = new CryptoStream(encImageStream,
                                  trans,
                                  CryptoStreamMode.Read);

  crypt.Read(decImage, 0, decImage.Length);

  crypt.Close();               
  encImageStream.Close();

  return decImage;
}
catch(Exception ex)
{
  EventLog.WriteEntry("ScriptService", ex.ToString(),
          EventLogEntryType.Error, EVENT_ERROR_DECRYPTION,
          EVENT_ERROR);
  return null;
}
}

Encrypted Image
.....
173f0: aa e9 ee 47 a2 32 b0 5d   ªéîG¢2°]
173f8: 8c a2 75 00 c7 2b 8c 19   ΢u.Ç+ÂŒ.
17400: e5 b3 cb dc e0 a6 3f 0d   å³ËÜà¦?.
17408: 3e 58                     >X

Author
16 Mar 2005 2:31 PM
dingfahd
Never mind, the problem was the length of the byte array I was decrypting.  I
changed

encImageStream.Read(EncryptedImage, 0,
                     EncryptedImage.Length);

to

EncryptedImage = encImageStream.ToArray();

and then trimmed the extra bytes on the server side after decrypting.  I'm
still kinda stumped why the same code worked on Windows XP and not on Server
2003.

AddThis Social Bookmark Button