使用某些加密算法时ArgumentException和NotImplementedException

时间:2013-01-03 17:14:49

标签: windows-runtime windows-store-apps

我目前正在使用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。这必须有一个理由(并行化等)。

例如,使用AesCbcPkcs7完全相同的代码。使用带有ECB和PKCS7的AES的类似代码,密钥长度为256,IV大小等于块长度也可以在同一台机器上运行。

ArgumentException可能是什么意思?

1 个答案:

答案 0 :(得分:0)

我自己找到了ArgumentException的答案:我甚至为不使用它的算法传递了初始化向量(如ECB密码模式或RC4)。这些算法要求初始化向量作为空传递。