2017-08-05 3 views
0

これで、送信前にバイト[]をコード化してデコードすることを試みています。私は「これはスーパーの秘密のメッセージです。」からバイト[]に変換され、RijdaelManagedを使用して暗号化されています。暗号化されるとバイト[30](暗号化されていない)からバイト[16]になりますが、暗号化を解除しようとすると、バイト[13]になり、文字列ビルダーで文字列に変換されると "System.Byte []" 。RijdaelManaged暗号化されたバイト[]と同じキー/ ivを使用して復号化されたバイト[]と異なる

編集:

static void Main(string[] args) 
    { 
     KeyIV keyIV = Encryption.GenerateKeyIV(); 
     int keyLen = keyIV.Key.Length; 
     int ivLen = keyIV.IV.Length; 

     string plain = "This is a super secret message"; 

     byte[] plainArray = Encoding.ASCII.GetBytes(plain); 

     byte[] encryptedArray = Encryption.EncryptBytes(ref plainArray, keyIV.Key, keyIV.IV); 

     byte[] decryptedArray = Encryption.DecryptBytes(ref encryptedArray, keyIV.Key, keyIV.IV); 

     Console.WriteLine("Original Message: {0}\n", plain); 
     Console.WriteLine("Byte[{0}] Converted Message: {1}\n", plainArray.Length, BitConverter.ToString(plainArray)); 
     Console.WriteLine("Byte[{0}] Encrypted Message: {1}\n", encryptedArray.Length, BitConverter.ToString(encryptedArray)); 
     Console.WriteLine("Byte[{0}] Decrypted Message: {1}\n", decryptedArray.Length, BitConverter.ToString(decryptedArray)); 

     Console.ReadLine(); 
    } 

暗号化方式:

 public static byte[] EncryptBytes(ref byte[] input, byte[] key, byte[] iv) 
    { 
     if (input.Length > 0 && key != null && iv != null) 
     { 
      using (RijndaelManaged rm = new RijndaelManaged() { Key = key, IV = iv }) 
      { 
       rm.Padding = PaddingMode.PKCS7; 

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

       using (MemoryStream ms = new MemoryStream()) 
       { 
        using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
        { 
         using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(input); } 
        } 

        return ms.ToArray(); 
       } 
      } 
     } 

     return null; 
    } 

私はすでにトリプル

メソッドの呼び出し

を暗号化/復号化する際keyIV.KeyとkeyIV.IVの両方が一致していることを確認解読方法:

 public static byte[] DecryptBytes(ref byte[] input, byte[] key, byte[] iv) 
    { 
     if (input != null && key != null && iv != null) 
     { 
      using (RijndaelManaged rm = new RijndaelManaged() { Key = key, IV = iv }) 
      { 
       ICryptoTransform decryptor = rm.CreateDecryptor(rm.Key, rm.IV); 

       using (MemoryStream ms = new MemoryStream()) 
       { 
        using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { cs.Write(input, 0, input.Length); } 

        return ms.ToArray(); 
       } 
      } 
     } 

     return null; 
    } 

結果の出力:

オリジナルメッセージ:54-68-69-73-20-69-73-20-61-20-73:これは超秘密のメッセージ

バイト[30]変換されたメッセージであります-75-70-65-72-20-73-65-63-72-65-74-20-6D-65-73-73-61-67-65

バイト[16]暗号化されたメッセージ:DD -85-D4-1E-E6-40-AA-44-DB-1A-17-33-A7-73-70-34

バイト[13]解読されたメッセージ:53-79-73-74-65 -6D-2E-42-79-74-65-5B-5D

+1

:私は私はあなたの配列のテキスト出力を比較すると、むしろバイト表現よりも、間違って何が起こっていたかのヒントを得た

 using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { cs.Write(input, 0, input.Length); cs.Flush(); } return ms.ToArray(); } 

つまり、 'encryptData'メソッドを調べると、' res'は30バイト、 'enc'は16バイトです。そうではないはずです。私はそれがどういうものか分かりません。 –

+0

encryptDataは同じクラスの内部(memorystream)から読み込みますが、62バイトをスキップします(これはヘッダーの長さなので)残りのバイト(この場合は30)を読み取り、暗号化して暗号化されたバイト[ ](この場合は16) –

+0

これはできませんので、16進数でバイナリデータをデータに提供して、何が起きているのかを確認してください。最終ブロックはパディングが追加され、暗号化関数は最後のブロックであることを知る必要があるので、最終ブロックは出力されていないということです。通常、最終コールがあります。ストリーミングコードによって暗黙的に呼び出されることもあります。 – zaph

答えて

2

問題は暗号化ストリームに書き込むためにStreamWriter(これはTextWriter)を使用しています。何をしているのは、オブジェクトを受け取る.Writeのオーバーロードを選択することです。配列を渡しています... TextWriterは、渡すオブジェクトにある種のスマートなものがあるとみなします。.ToString()ターゲットストリームに書き込むストリング値。この場合、あなたの配列は暗号化されていないので、値 "System.Byte []"を暗号化しています。

実際、StreamWriterは必要ありません。暗号化メソッドがCryptoStreamに渡される配列のバイトを書きたいだけです。幸運なことに、ストリームにはそれだけでWriteメソッドが組み込まれています。代わりにあなたの暗号化方式の本体でこれを試してみてください:だから

 Console.WriteLine("Original Message: {0}\n", plain); 
     Console.WriteLine("Byte[{0}] Converted Message: {1}\n", plainArray.Length, Encoding.ASCII.GetString(plainArray)); 
     Console.WriteLine("Byte[{0}] Encrypted Message: {1}\n", encryptedArray.Length, Encoding.ASCII.GetString(encryptedArray)); 
     Console.WriteLine("Byte[{0}] Decrypted Message: {1}\n", decryptedArray.Length, Encoding.ASCII.GetString(decryptedArray)); 
+0

私の良さ私はそれがとてもシンプルであり、ストリームライターは文字列を書くことを試みているテキストライターだとは信じられませんが、文字列の出力が常にSystem.Byte []私は自分の頭が叩かれた近くにたたいた!これはこのような暗号化を書く私のはじめてのことですので、どうもありがとう! –

関連する問題