ここに暗号化方法を使用する従来の ASP.NET サイトがあります。
http://www.codekeep.net/snippets/af1cd375-059a-4175-93d7-25eea2c5c660.aspx
次のメソッドを呼び出すと、ページの読み込みが非常に遅くなり、最終的に Connection Reset が返されます。
Decrypt(" ", true);
後続のページ要求でメソッドが複数回呼び出されると、アプリケーション プールが停止します。
これは、.NET Framework v3.5 を実行している Windows 2008 サーバーで発生しています。
TransformFinalBlock()問題を呼び出しに絞り込みました。
注: Cassini では、接続タイムアウトは発生しません。代わりに、次の例外がスローされます。
System.Security.Cryptography.CryptographicException: Bad Data
他の文字列に対して Decrypt() を呼び出しても、どの環境でも問題は発生しません。
なぜこうなった?TripleDESCryptoServiceProvider のバグですか?
明らかに、cipherString をフィルター処理して " " を拒否し、この特定の問題を回避できます。ただし、私が疑わない他の cipherString 値が DoS を引き起こすのではないかと心配しています。
更新 2011.06.28
以下は、問題を再現するための最小限のコードです。
// problem occurs when toEncryptArray is an empty array {}
byte[] toEncryptArray = {};
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
byte[] keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes("dummy_key"));
hashmd5.Clear();
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateDecryptor();
// the following line can crashes the ASP.NET Application Pool (may need to call multiple times).
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
tdes.Clear();