填充无效,AesManaged Encrypt and Decrypt

时间:2015-12-08 13:19:55

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

我遇到了奇怪的问题,因为只有我有时会出现这种情况

  

填充无效,无法删除。

为什么我得到它?它是Windows Phone 8.0项目。我搜索过,发现我应该添加这个

aesManaged.Padding = PaddingMode.None

但它的WP8并没有PaddingMode。

 public LoginView()
        {
            this.InitializeComponent();
            try
            {

                string original = "Here is some data to encrypt!";

                AesManaged myAes = new AesManaged();
                byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);
                Console.WriteLine("Original:   {0}", original);

                var str = System.Text.Encoding.Unicode.GetString(encrypted,0,encrypted.Length);
                var str1 = System.Text.Encoding.Unicode.GetBytes(str);


                AesManaged myAes1 = new AesManaged();

                myAes1.Key = myAes.Key;
                myAes1.IV = myAes.IV;
                myAes.Clear();
                string roundtrip = DecryptStringFromBytes_Aes(str1, myAes1.Key, myAes1.IV); // HERE IS EXCEPTION
                Console.WriteLine("Round Trip: {0}", roundtrip);

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }

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 the encrypted bytes from the memory stream.
        return encrypted;

    }



    static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
    {
        // 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;

    }

1 个答案:

答案 0 :(得分:3)

改变这个:

var str = System.Text.Encoding.Unicode.GetString(encrypted,0,encrypted.Length);
var str1 = System.Text.Encoding.Unicode.GetBytes(str);

为此:

var str = Convert.ToBase64String(encrypted);
var str1 = Convert.FromBase64String(str);

编码类不应用于将字符串转换为字节,反之亦然。

您还应该删除StreamReader和StreamWriter并直接写入/读取MemoryStream