2012-03-11 5 views
0

Итак, вот мой беспорядок. Он возвращает случайные символы Unicode. Я использую тот же ключ для обоих методов, а также тот же IV, и я использую одну и ту же кодировку для них обоих. Что вызывает случайный ответ?AES в обе стороны, производя случайные символы

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(); 
     } 
    } 
} 

ответ

0

Ваш пример кода не удается, так как метод Encrypt возвращает пустой массив. Вместо того, чтобы пытаться опрокинуть его самостоятельно, вам лучше использовать то, что, как доказано, работает.

Пример из AesCryptoServiceProvider documentation работ на месте ваших Encrypt и Decrypt методы из вашего образца кода:

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; 
} 
+1

«Вместо t зная, что вы будете кататься самостоятельно, вам лучше использовать то, что, как доказано, работает ». - хороший совет. –