0

現在、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 の意味は何ですか?

4

1 に答える 1

0

ArgumentExceptionに対する答えを自分で見つけました。初期化ベクトルを使用しないアルゴリズム(ECB暗号モードやRC4など)でも初期化ベクトルを渡しました。これらのアルゴリズムでは、初期化ベクトルがnullとして渡される必要があります。

于 2013-01-05T09:31:28.897 に答える