我正在尝试使用Windows Phone应用程序中“普通”(桌面).NET框架的一些加密代码,但我无法正确翻译代码。
这是正常工作的桌面代码:
internal static byte[] decryptECB_Desktop(byte[] image)
{
using (RijndaelManaged rm = new RijndaelManaged())
{
rm.Mode = CipherMode.ECB;
rm.Key = Convert.FromBase64String("key");
rm.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
rm.Padding = PaddingMode.Zeros;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, rm.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(image, 0, image.Length);
return ms.ToArray();
}
}
}
}
我已尽力将其翻译为WinRT .NET Framework可用的代码,但它给了我一个
Value does not fall within the expected range.
错误(System.ArgumentException)。
以下是我正在使用的代码:
internal static byte[] decryptECB_WinRT(byte[] image)
{
IBuffer toDecryptBuffer = CryptographicBuffer.CreateFromByteArray(image);
SymmetricKeyAlgorithmProvider aes = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcb);
CryptographicKey symetricKey = aes.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(Convert.FromBase64String("key")));
IBuffer ivBuffer = CryptographicBuffer.CreateFromByteArray(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
IBuffer buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, ivBuffer); // <--- Exception here
byte[] decrypted;
CryptographicBuffer.CopyToByteArray(buffDecrypted, out decrypted);
return decrypted;
}
执行
时出现错误CryptographicEngine.Decrypt(...)
非常感谢任何帮助。 提前谢谢。
解决方案(来自Cyprien Autexier):
public static byte[] decryptECB_WinRT(byte[] image)
{
IBuffer toDecryptBuffer = CryptographicBuffer.CreateFromByteArray(image);
SymmetricKeyAlgorithmProvider aes = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcb);
CryptographicKey symetricKey = aes.CreateSymmetricKey(CryptographicBuffer.DecodeFromBase64String("base64key"));
IBuffer buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, null);
byte[] decrypted;
CryptographicBuffer.CopyToByteArray(buffDecrypted, out decrypted);
return decrypted;
}
我只对解密来自其他服务的数据感兴趣,而不关心ECB的安全性。如果情况并非如此,请注意Cyprien Autexier在回复中所说的内容:
还有一件事你应该非常小心已知安全漏洞的ECB。
答案 0 :(得分:1)
这可能是因为您使用的是ECB encryption mode which does not uses an IV,因此您应该传递null而不是当前的归零IV。
IBuffer buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, null);
此外,您可以转换your base 64 string directly to CryptographicBuffer
还有一件事你应该非常小心已知安全漏洞的ECB。