WinRT中的AES ECB解密,从.NET Desktop转换代码

时间:2014-10-28 18:37:27

标签: c# windows-runtime cryptography aes windows-phone-8.1

我正在尝试使用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。

1 个答案:

答案 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。