我目前正在使用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可能是什么意思?
答案 0 :(得分:0)
我自己找到了ArgumentException的答案:我甚至为不使用它的算法传递了初始化向量(如ECB密码模式或RC4)。这些算法要求初始化向量作为空传递。