Windows Phone 8 c#中的加密解密

时间:2015-03-10 09:32:51

标签: c# windows-phone-8 encryption cryptography

我正在尝试使用AES算法加密我的数据。我从MSDN网站encryption decryption获得了这些功能。我正在做的是我正在加密数据并使用以下方法将其存储为字符串 byte[] encrypted = EncryptStringToBytes_Aes(response, myAes.Key, myAes.IV); string saveresponse = Convert.ToBase64String(encrypted);

然后我将它保存在IsolatedStorageSettings

settings.Add(merchantId, saveresponse);

但是我面临的问题是,当用户在某个时间到来并点击我的页面时,我首先在IsolatedStorageSettings对象中检查数据是否存在我将该数据传递给解密并进一步处理。我用来解密的步骤是如下

byte[] temp = Convert.FromBase64String(response);


response = DecryptStringFromBytes_Aes(temp, myAes.Key, myAes.IV);

但上面的行给出了错误“值不能为空。 参数名称:inputBuffer“

我无法找到我的错误。你们可以告诉我们应该采取哪些措施来实现这一目标。

这是加密代码

 static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
    {
        // Check arguments. 
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        if (Key == null || Key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (IV == null || IV.Length <= 0)
            throw new ArgumentNullException("Key");
        byte[] encrypted;
        // Create an AesManaged object 
        // with the specified key and IV. 
        using (AesManaged aesAlg = new AesManaged())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            // Create a decrytor to perform the stream transform.
            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            // Create the streams used for encryption. 
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {

                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }


  return encrypted;
}

这是解密代码

    static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        try
        {
            // Check arguments. 
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");

            // Declare the string used to hold 
            // the decrypted text. 
            string plaintext = null;

            // Create an AesManaged object 
            // with the specified key and IV. 
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption. 
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting stream 
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }
            return plaintext;

        }
        catch (Exception ex) {
            return "Error";
        }
    }

并在按钮1上单击我调用加密方法

using (AesManaged myAes = new AesManaged())
                                    {

byte[] encrypted = EncryptStringToBytes_Aes(response, myAes.Key, myAes.IV);
string saveresponse = Convert.ToBase64String(encrypted);
}

并在按钮2上调用解密方法

using (AesManaged myAes = new AesManaged())
                                        {

    byte[] temp= Convert.FromBase64String(response)
    response = DecryptStringFromBytes_Aes(temp, myAes.Key, myAes.IV);
    }

1 个答案:

答案 0 :(得分:1)

问题是using (AesManaged myAes = new AesManaged()){}阻止它生成新密钥和IV加密和解密。因此,解密时密钥和IV不匹配,因此生成错误。只需删除使用块并声明在全球范围内对myAes对象进行了管理,问题得以解决。所以最终的代码看起来像

AesManaged myAes = new AesManaged();

在按钮上单击加密;

byte [] encrypted = EncryptStringToBytes_Aes(response,myAes.Key,myAes.IV); string saveresponse = Convert.ToBase64String(encrypted);

和button2点击解密

byte[] temp = Convert.FromBase64String(response);


response = DecryptStringFromBytes_Aes(temp, myAes.Key, myAes.IV);

多数民众赞成,编码很开心。