2012-03-11 2 views
0

그래서 여기에 내 혼란이 있습니다. 임의의 유니 코드 문자를 반환합니다. 동일한 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 메서드가 빈 배열을 반환하기 때문에 코드 샘플이 실패했습니다. 스스로 롤을 돌리기보다는 작동이 입증 된 것을 사용하는 것이 좋습니다.

샘플 코드에서 EncryptDecrypt 방법 대신에 AesCryptoServiceProvider documentation 작품에서 예 : 또한

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 자신을 굴리기 위해 사기를 쳤다면 효과가 입증 된 것을 사용하는 것이 더 낫습니다. " - 좋은 조언. –

관련 문제