【问题标题】:AES round trip producing random charsAES往返产生随机字符
【发布时间】:2012-03-11 23:09:54
【问题描述】:

所以这是我的烂摊子。它返回随机的 Unicode 字符。我让它对这两种方法使用相同的密钥,以及相同的 IV,并且我对它们都使用相同的编码。是什么导致了随机响应?

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace FileFish
{
    class Program
    {
        public static void Main()
        {
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.GenerateIV();
            Console.WriteLine(Decrypt(Encoding.UTF8.GetBytes("APPLEAPPLEAPPLEAPPLEAPPLEAPPLEAP"), aes.IV, Encrypt(Encoding.UTF8.GetBytes("APPLEAPPLEAPPLEAPPLEAPPLEAPPLEAP"), aes.IV, "cheese")));
            Console.ReadKey(true);
        }

        private static byte[] Encrypt(byte[] key, byte[] iv, string plaintext)
        {
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.Key = key;
            aes.IV = iv;
            ICryptoTransform encryptor = aes.CreateEncryptor();
            MemoryStream ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(new CryptoStream(ms, encryptor, CryptoStreamMode.Write));
            sw.Write(plaintext);
            return ms.ToArray();
        }

        private static string Decrypt(byte[] key, byte[] iv, byte[] ciphertext)
        {
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.Key = key;
            aes.IV = iv;
            ICryptoTransform decryptor = aes.CreateEncryptor();
            MemoryStream ms = new MemoryStream(ciphertext);
            StreamReader sr = new StreamReader(new CryptoStream(ms, decryptor, CryptoStreamMode.Read));
            return sr.ReadToEnd();
        }
    }
}

【问题讨论】:

    标签: c# .net visual-studio aes aescryptoserviceprovider


    【解决方案1】:

    您的代码示例失败,因为Encrypt 方法返回一个空数组。与其尝试自己动手,不如使用一些被证明有效的东西。

    AesCryptoServiceProvider documentation 中的示例可以代替示例代码中的 EncryptDecrypt 方法:

    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 AesCryptoServiceProvider object
        // with the specified key and IV.
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            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 AesCryptoServiceProvider object
        // with the specified key and IV.
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            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;
    }
    

    【讨论】:

    • “与其自己动手,不如使用一些被证明有效的东西。” - 好建议。
    【解决方案2】:

    另外,这不是导致此问题的原因,而是: http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx

    不要通过字符串编码往返密文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多