2017-10-01 4 views
0

암호화 된 문자열을 SQL 데이터베이스에 바이트 배열로 저장하고 싶습니다. 잘못된 작업을 파악할 수 없습니다. 코드는 다음과 같습니다AES 암호화를 사용하여 문자열 암호화 및 암호 해독 - C#

private void loginBtn_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      string password = passwordBox.Text.ToString(); 

      using (Aes algorithm = Aes.Create()) 
      { 
       byte[] encryptedPassword = EncryptString(password, algorithm.Key, algorithm.IV); 

       string roundTrip = DecryptString(encryptedPassword, algorithm.Key, algorithm.IV); 

       MessageBox.Show("Encrypted Password: " + encryptedPassword.ToString() + '\n' + "Round Trip: " + roundTrip.ToString()); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

그리고 'EncryptString'와 'DecryptString'에 사용되는 코드가 Microsoft's Aes Class Reference (페이지의 끝 부분에 위치한 예)의 하나입니다.

나는 내 코드를 실행하고 모든 이것이있는 메시지 상자에서 저를 제공합니다,

Encrypted Password: System.Byte[]

Round Trip: (empty space)

static byte[] EncryptString(string str, byte[] key, byte[] IV) 
    { 
     if (str == null || str.Length <= 0) 
      throw new ArgumentNullException("string"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("key"); 
     if (IV == null || IV.Length <= 0) 
      throw new ArgumentNullException("IV"); 

     byte[] encrypted; 

     using (Aes algorithm = Aes.Create()) 
     { 
      algorithm.Key = key; 
      algorithm.IV = IV; 

      ICryptoTransform encryptor = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV); 

      using (MemoryStream msEncrypt = new MemoryStream()) 
      { 
       using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
       { 
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
        { 
         swEncrypt.Write(str); 
        } 
        encrypted = msEncrypt.ToArray(); 
       } 
      } 
     } 

     return encrypted; 
    } 

    static string DecryptString(byte[] cipher, byte[] key, byte[] IV) 
    { 
     if (cipher == null || cipher.Length <= 0) 
      throw new ArgumentNullException("cipher"); 
     if (key == null || key.Length <= 0) 
      throw new ArgumentNullException("key"); 
     if (IV == null || IV.Length <= 0) 
      throw new ArgumentNullException("IV"); 

     string decrypted; 

     using (Aes algorithm = Aes.Create()) 
     { 
      algorithm.Key = key; 
      algorithm.IV = IV; 

      ICryptoTransform decryptor = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV); 

      using (MemoryStream msDecrypt = new MemoryStream()) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 
         decrypted = srDecrypt.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return decrypted; 
    } 

누군가가 내가 그것을 해결하는 데 도움이 수 주 시겠어요?

P. 텍스트 상자는 샤아가

+0

저에게 잘 작동합니다. 귀하의 실제 암호화/암호 해독 코드를 게시하십시오. –

+0

이 프로그램은 나를 위해 올바르게 작동합니다 -'string password = "ABCD"', roundTrip alco는 "ABCD"를 포함합니다. 비밀번호로 무엇을 시도 했습니까? Microsoft의 예제에서'EncryptString'과'DecryptString' 메소드를 수정 했습니까? –

+0

메시지 줄을 MessageBox.Show ("Encrypted Password :"+ Encoding.ASCII.GetString (encryptedPassword) + '\ n'+ "Round Trip :"+ roundTrip)로 변경하면 더 잘 볼 수 있습니다. 또는 뭔가 (아마도 ACII 대신 UTF, 문자 집합에 따라 다릅니다). –

답변

1

DecryptString 방법, 당신이 입력으로 msDecrypt 메모리 스트림의 생성자에 cipher 매개 변수를 전달하는 것을 잊었다 *에 살고 있고 암호를 가지고, 따라서 방법은 실제로 빈 입력 스트림을 해독, 그래서 결과가 너무 비어 있습니다.

라인

using (MemoryStream msDecrypt = new MemoryStream()) 

실제로해야한다 :

using (MemoryStream msDecrypt = new MemoryStream(cipher)) 

다음 모든 작동합니다.

+0

방금 ​​같은 것을 발견했습니다! 그게 나에게 독서를 계속 가르쳐 줄거야 :-) –

+0

대단히 고마워. 이제 코드 예제에 더 많은주의를 기울여야한다는 것을 알고 있습니다. 너는 그것을 고쳤다, 나는 그것이 너무 잘 숨어 있다고 믿을 수 없다. 이제, 나는 또 다른 작은 문제가있다. Encoding.ASCII.GetBytes를 사용하는 경우 (여기에는 64 자); Encoding.ASCII.GetBytes (여기에는 32 자입니다.); IV로, 그것은 나에게 오류를 준다 : "지정된 키가이 알고리즘에 유효한 크기가 아니다.". 내가 어떻게해야하는지 알고 있니? Aes 알고리즘의 BlockSize를 수정하려고했지만 작동하지 않습니다. 대신 동일한 오류 메시지가 나타납니다. 다시 한 번 감사드립니다! –

+0

AES에는 세 가지 변종 (AES-128, AES-192 및 AES-256) 만 있습니다. 따라서 ** 키 크기 **는 128 비트 (16 바이트), 192 비트 (24 바이트) 또는 256 비트 (32 바이트) 여야합니다. [LegalKeySizes] (https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.symmetricalgorithm.legalkeysizes?view=netframework-4.7) 속성에서 유효한 키 크기를 가져올 수 있습니다. 또한 모든 AES 변형은 [LegalBlockSizes] (https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography)에서 볼 수 있듯이 ** 블록 크기 **가 128 비트 (16 바이트)가 필요합니다. .symmetricalgorithm.legalblocksizes? view = netframework-4.7) 속성. –