AES Encryption Windows Phone 8.1

本文关键字:Phone Windows Encryption AES | 更新日期: 2023-09-27 18:18:05

我需要在Windows Phone 8.1的应用程序上做128位AES加密。我分别使用以下代码对数据进行加密和解密:

    private string GetEncryptedContent(string content)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey);
        byte[] data = Encoding.UTF8.GetBytes(content);
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, null);
        return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length);
    }
    private string GetDecryptedContent(string content)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey);
        byte[] data = Encoding.UTF8.GetBytes(content);
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, null);
        return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length);
    }

但是加密和解密似乎不能正常工作。它被加密为一些unicode字符并在解密时抛出崩溃:

长度不是块大小的倍数,也没有填充选中。'r'n参数名称:密文

我在这里做错了什么?有人能帮帮我吗?

编辑

在谷歌上花了很多时间之后,我发现了以下加密和解密的方法,但它们似乎也不起作用。

    public string GetEncryptedContent(string input, string pass)
    {
        SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7);
        CryptographicKey AES;
        HashAlgorithmProvider HAP = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5);
        CryptographicHash Hash_AES = HAP.CreateHash();
        string encrypted = "";
        try
        {
            byte[] hash = new byte[32];
            Hash_AES.Append(CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(pass)));
            byte[] temp;
            CryptographicBuffer.CopyToByteArray(Hash_AES.GetValueAndReset(), out temp);
            Array.Copy(temp, 0, hash, 0, 16);
            Array.Copy(temp, 0, hash, 15, 16);
            AES = SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(hash));
            IBuffer Buffer = CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(input));
            encrypted = CryptographicBuffer.EncodeToBase64String(CryptographicEngine.Encrypt(AES, Buffer, null));
            return encrypted;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

    public string GetDecryptedContent(string input, string pass)
    {
        SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7);
        CryptographicKey AES;
        HashAlgorithmProvider HAP = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5);
        CryptographicHash Hash_AES = HAP.CreateHash();
        string decrypted = "";
        try
        {
            byte[] hash = new byte[32];
            Hash_AES.Append(CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(pass)));
            byte[] temp;
            CryptographicBuffer.CopyToByteArray(Hash_AES.GetValueAndReset(), out temp);
            Array.Copy(temp, 0, hash, 0, 16);
            Array.Copy(temp, 0, hash, 15, 16);
            AES = SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(hash));
            IBuffer Buffer = CryptographicBuffer.DecodeFromBase64String(input);
            byte[] Decrypted;
            CryptographicBuffer.CopyToByteArray(CryptographicEngine.Decrypt(AES, Buffer, null), out Decrypted);
            decrypted = Encoding.UTF8.GetString(Decrypted, 0, Decrypted.Length);
            return decrypted;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

编辑2

最终设法使加密工作正常,但解密仍然不工作,大概是因为我传递的编码不是正确的:

    private string GetEncryptedContent(string content)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey);
        byte[] data = Encoding.UTF8.GetBytes(content);
        byte[] iv = new byte[128 / 8]; // Adding this solved the encryption issue.
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, iv);
        return Convert.ToBase64String(cipherText);
    }
    private string GetDecryptedContent(string content)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(EncryptionKey);
        byte[] data = Convert.FromBase64String(content); // Believe this is where the issue is, but not able to figure it out.
        byte[] iv = new byte[128 / 8]; // Added this to make the decryption work the same way.
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, iv);
        return Convert.ToBase64String(cipherText);
    }

AES Encryption Windows Phone 8.1

我终于解决了这个问题。问题出在文本编码上。使用正确的编码解决了这个问题。下面的工作代码:

    public static string EncryptAES(string content, string password)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(password);
        byte[] data = Encoding.UTF8.GetBytes(content);
        byte[] iv = new byte[keyMaterial.Length];
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, iv);
        return Convert.ToBase64String(cipherText);
    }
    public static string DecryptAES(string content, string password)
    {
        byte[] keyMaterial = Encoding.UTF8.GetBytes(password);
        byte[] data = Convert.FromBase64String(content);
        byte[] iv = new byte[keyMaterial.Length];
        var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
        var key = provider.CreateSymmetricKey(keyMaterial);
        byte[] cipherText = WinRTCrypto.CryptographicEngine.Decrypt(key, data, iv);
        return Encoding.UTF8.GetString(cipherText, 0, cipherText.Length);
    }

WinRTCrypto可作为PCLCrypto的一部分使用。