繁体   English   中英

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

[英]AES ECB decryption in WinRT, translating code from .NET Desktop

我正在尝试在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真正小心。

这可能是因为您使用的ECB加密模式不使用IV,因此您应该传递null而不是当前的已归零IV。

IBuffer buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, null); 

另外,您可以将基本64位字符串直接转换为CryptographicBuffer

此外,您还应该对具有已知安全漏洞的ECB真正小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM