2017-10-01 3 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.S.テキストボックスは、シャアがDecryptString方法では*に

+0

私にとってうまく動作します。あなたの実際の暗号化/復号化コードを投稿してください。 –

+0

このプログラムは正しく動作します。 'string password =" ABCD "'で、roundTripは "ABCD"を含んでいます。あなたは何をパスワードとして試しましたか? Microsoftの例から、 'EncryptString'と' DecryptString'メソッドを変更しましたか? –

+0

MessageBox.Show( "Encrypted Password:" + Encoding.ASCII.GetString(encryptedPassword)+ '\ n' + "Round Trip:" + roundTrip)にメッセージ行を変更した方が良いでしょう。 (おそらくACIIの代わりにUTF、あなたのキャラクターセットに依存します)。 –

答えて

1

をsettedパスワードを持っている、あなたが入力として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-128、AES-192、AES-256の3種類しかありません。したがって**キーサイズ**は128ビット(16バイト)、192ビット(24バイト)または256ビット(32バイト)でなければなりません。有効なキーサイズは[LegalKeySizes](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.symmetricalgorithm.legalkeysizes?view=netframework-4.7)プロパティから取得できます。また、[LegalBlockSizes](https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography)に見られるように、すべてのAESバリエーションでは128ビット(16バイト)のブロックサイズ**が必要です。 .symmetricalgorithm.legalblocksizes?view = netframework-4.7)プロパティ。 –