現在、Windows ランタイムで暗号化をいじっています。特定の暗号化アルゴリズムを使用すると、NotImplementedException (AesCcm、AesGcm) または ArgumentException (AesEcb、AesEcbPkcs7、DesEcb、DesEcbPkcs7、Rc2Ecb、Rc2EcbPkcs7、Rc4、TripleDesEcb、TripleDesEcbPkcs7) が発生します。
各アルゴリズムに正しいキーの長さを使用します (キーの長さが間違っていると ArgumentException がトリガーされると考えました)。RC4 の場合、キーは可変であるため、サイズ 1024 のキーを使用します。パディングなしのバージョンを使用する場合、データを自分でブロック長にパディングします。CCM と GCM を使用した AES は明らかに Windows 8、64 ビットに実装されていないことを理解しています。しかし、ECB 暗号モードのバリアントと RC4 の ArgumentException は奇妙です。
サンプルコードは次のとおりです。
SymmetricKeyAlgorithmProvider symmetricKeyAlgorithmProvider =
SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7);
byte[] plainText = {1, 2, 3, 4, 5, 6, 7, 9, 9, 0};
const uint keySize = 256;
byte[] key = CryptographicBuffer.GenerateRandom(keySize).ToArray();
uint blockLength = symmetricKeyAlgorithmProvider.BlockLength;
byte[] initializationVector =
CryptographicBuffer.GenerateRandom(blockLength).ToArray();
CryptographicKey cryptographicKey =
symmetricKeyAlgorithmProvider.CreateSymmetricKey(key.AsBuffer());
// This line throws an ArgumentException. The exception gives no hint what
// argument is meant and why the value is invalid.
byte[] cipherText = CryptographicEngine.Encrypt(cryptographicKey,
plainText.AsBuffer(), initializationVector.AsBuffer()).ToArray();
ところで、ECB が安全とは見なされていないことは知っています。しかし、Microsoft は特定のアルゴリズムに ECB を含めました。それには理由があるはずです(並列化など)。
たとえば、まったく同じコードが AesCbcPkcs7 を使用して機能します。ECB および PKCS7 で AES を使用し、キーの長さが 256 で、IV のサイズがブロックの長さと同じである .NET の同様のコードは、同じマシンでも機能します。
ArgumentException の意味は何ですか?