1

I have an extra question mark(s) when it converts to string.
Here is my code:

My Encryption method:

    public static Stream EncryptStream(Stream inputStream)
            {
                string key = "ThisIsMySuperSecureKey";
                byte[] keyBytes = Encoding.UTF32.GetBytes(key);

                Rfc2898DeriveBytes derviedKey = new Rfc2898DeriveBytes(key, keyBytes);

                RijndaelManaged rijndaelCSP = new RijndaelManaged();
                rijndaelCSP.Key = derviedKey.GetBytes(rijndaelCSP.KeySize / 8);
                rijndaelCSP.IV = derviedKey.GetBytes(rijndaelCSP.BlockSize / 8);

                var encryptor = rijndaelCSP.CreateEncryptor();

                MemoryStream ms = new MemoryStream();
                CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);

                //inputStream.Position = 0;
                byte[] toEncrypt = StreamToByteArray(inputStream);

                cs.Write(toEncrypt, 0, toEncrypt.Length);
                cs.FlushFinalBlock();

                MemoryStream output = new MemoryStream(ms.ToArray());
                ms.Close();
                return (Stream)output;

            }

My method to Convert Stream to Byte Array:

       public static byte[] StreamToByteArray(Stream inputStream)
        {

            var ms = new MemoryStream();
            inputStream.Position = 0;
            inputStream.CopyTo(ms);
            return ms.ToArray();
        }
        public static Stream DecryptStream(Stream inputStream)
        {
            string key = "ThisIsMySuperSecureKey";
            byte[] keyBytes = Encoding.UTF32.GetBytes(key);

            Rfc2898DeriveBytes derviedKey = new Rfc2898DeriveBytes(key, keyBytes);

            RijndaelManaged rijndaelCSP = new RijndaelManaged();
            rijndaelCSP.Key = derviedKey.GetBytes(rijndaelCSP.KeySize / 8);
            rijndaelCSP.IV = derviedKey.GetBytes(rijndaelCSP.BlockSize / 8);

            var decryptor = rijndaelCSP.CreateDecryptor();

            byte[] arrayOfEncrypedStream = StreamToByteArray(inputStream);

            MemoryStream ms = new MemoryStream(arrayOfEncrypedStream);
            CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);


            cs.Read(arrayOfEncrypedStream, 0, arrayOfEncrypedStream.Length);
            MemoryStream output = new MemoryStream(ms.ToArray());

            ms.Close();
            return output;
         }

My method to check if Stream is encrypted:

public static string IsCryptedStream(Stream cryptedStream)
        {
            string result = "";
            byte[] convStremToBytes = Encryption.StreamToByteArray(cryptedStream);
            return result = Encoding.UTF32.GetString(convStremToBytes);
        }

I read similar article with this issue, but it didn't work out. Need help. Thank you!!!

UPDATE:

    static void Main(string[] args)
    {
       byte[] streamBytes = Encoding.Unicode.GetBytes("Hello people");
       MemoryStream ms = new MemoryStream(streamBytes);
       var cryptedStream =  Encryption.EncryptStream(ms);
       var decryptStream = Encryption.DecryptStream(cryptedStream);
       string isCryptedStreamAfterDecryption = 
   Demo3.IsCryptedStream(decryptStream);
       Console.WriteLine($"After Decryption: {isCryptedStreamAfterDecryption}");
    }

Result: "Hello people???"

RedBoat
  • 19
  • 3
  • Possible duplicate of [C# Rijndael decryption returns extra question mark character](https://stackoverflow.com/questions/28230144/c-sharp-rijndael-decryption-returns-extra-question-mark-character) – Martheen Jul 24 '17 at 03:30
  • 1
    Is the question mark at the beginning or the end? Can you show an example? – Artjom B. Jul 24 '17 at 05:30
  • I have a question mark at the end of encrypted sting – RedBoat Jul 26 '17 at 02:00

0 Answers0