2016-05-10 4 views
1

は、C#でEn-/Decrypterを書き込もうとしています。タイトルが示すように、私はCryptoStream.close()でSystem.Security.Cryptography.CryptographicExceptionを取得します。私はまだ解決策を見つけていない。誰もが助けることを願っています。CryptoStream.close()でC#暗号化System.Security.Cryptography.CryptographicException

public static string viaRijndael(byte[] input, string key, string iV) 
    { 
     Rijndael RijCrypt = Rijndael.Create(); 

     RijCrypt.Key = System.Text.Encoding.UTF8.GetBytes(Tools.GetMD5Hash(Tools.GetMD5Hash(key))); 

     RijCrypt.IV = System.Text.Encoding.UTF8.GetBytes(Tools.GetMD5Hash(Tools.GetMD5Hash(key)).Substring(0, 16)); 

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

     cs.Write(input, 0, input.Length); 
     cs.Close(); // System.Security.Cryptography.CryptographicException 

     byte[] DecryptedBytes = ms.ToArray(); 

     return System.Text.Encoding.UTF8.GetString(DecryptedBytes); 
    } 
+0

質問に例外を追加してください。 – Gusman

+0

System.Security.Cryptography.CryptographicException –

+0

型、メッセージ、呼び出しスタックではありません... – Gusman

答えて

0

MSDN Stream.Closeドキュメントは言う:

「この方法は、すべてのリソースを解放する場合はtrueを指定して、処分を呼び出しますが、具体的Closeメソッドを呼び出す必要はありません。その代わり、すべてのStreamオブジェクトがあることを確認してください。 Streamオブジェクトとそのすべてのリソースが確実に破棄されるか、またはDisposeメソッドを明示的に呼び出すことができるように、使用ブロック(またはVisual Basicのブロックの使用)内でStreamオブジェクトを宣言できます。

public static string viaRijndael(byte[] input, string key, string iV) 
{ 
    byte[] decryptedBytes; 

    using (Rijndael rijCrypt = Rijndael.Create()) 
    { 
     rijCrypt.Key = System.Text.Encoding.UTF8.GetBytes(Tools.GetMD5Hash(Tools.GetMD5Hash(key))); 

     rijCrypt.IV = System.Text.Encoding.UTF8.GetBytes(Tools.GetMD5Hash(Tools.GetMD5Hash(key)).Substring(0, 16)); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      using (CryptoStream cs = new CryptoStream(ms, rijCrypt.CreateDecryptor(), CryptoStreamMode.Write)) 
      { 
       cs.Write(input, 0, input.Length); 
      } 

      decrpytedBytes = ms.ToArray(); 
     } 
    } 

    return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
} 

の本以上のすべてがCryptoStreamクラスのMSDNに良い詳細に説明されています

はそのように私はあなたのストリームの処分を処理するために、次のような何かをしようとお勧めします。