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.