2017-04-20 7 views
1

暗号化と復号化に使用するテキストファイル "toEnc.txt"(ファイルサイズは485b)があります。C#AES解読は常に10バイトの乱雑なコードで終了します。

暗号化後、「byte [] enc_data」の長さは496bに増加します。
しかし、私は "enc.Padding = PaddingMode.None;"と設定しました。

解読後、テキストの内容が何であっても、 "testout.txt"は常に最後に10バイトの乱雑なコードを持っています。

また、.zipファイルも試しました。暗号化されたファイルの長さも増え、解読後に解読されたファイルが壊れていました(おそらく、zipファイルの最後に奇妙なコードがあるためです)。

 private async Task RunEncryption() 
     { 
      String data; 
      using (StreamReader sr = new StreamReader("toEnc.txt")) 
      { 
       data = sr.ReadToEnd(); 
      } 
      byte[] enc_data = await Program.myEncrypt(data); 

      await RunDecrypt(enc_data); //to test if decryption works 
     } 

    static async Task<byte[]> myEncrypt(string toEncStr) 
    { 
     byte[] encrypted; 
     using (Aes enc = Aes.Create()) 
     { 
      Aes encaes = Aes.Create(); 
      encaes.Key = enc.Key; 
      encaes.IV = enc.IV; 

      Program.Key = enc.Key; 
      Program.IV = enc.IV; 

      try 
      { 
       FileStream fs = new FileStream("key.txt", FileMode.OpenOrCreate); 
       fs.Write(Key, 0, Key.Length); 
       fs.Write(IV, 0, IV.Length); 
       fs.Close(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Encryption failed!{0}.", e.Message); 
       Environment.Exit(0); 
      } 

      enc.Padding = PaddingMode.None; 

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

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

    private async Task RunDecrypt(byte[] inbytes) 
    { 
     try 
     { 
      String write_data = await myDecrypt(inbytes); 
      using (StreamWriter sw = new StreamWriter("testout.txt", true)) 
      { 
       sw.Write(write_data); 
       sw.Close(); 
      } 
     } 
     catch (Exception e) 
     { 

     } 
    } 
    async Task<String> myDecrypt(byte[] toDecBytes) 
    { 
     try 
     { 
      String decrypted; 
      using (Aes dec = Aes.Create()) 
      { 
       byte[] Key = new byte[dec.Key.Length]; 
       byte[] IV = new byte[dec.IV.Length]; 
       FileStream fsread = new FileStream("key.txt", FileMode.Open); 
       fsread.Read(Key, 0, Key.Length); 
       fsread.Read(IV, 0, IV.Length); 
       fsread.Close(); 

       dec.Key = Key; 
       dec.IV = IV; 

       dec.Padding = PaddingMode.None; 
       ICryptoTransform decryptor = dec.CreateDecryptor(dec.Key, dec.IV); 
       using (MemoryStream msDecrypt = new MemoryStream(toDecBytes)) 
       { 
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
         { 
          decrypted = srDecrypt.ReadToEnd(); 
          //decrypted = srDecrypt.Read( , 0,); 
          return decrypted; 
         } 
        } 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Decryption failed! {0}.", e.Message); 
      return @"null"; 
     } 
    } 
+0

なぜ2つの 'Aes'変数、' enc'と 'encaes'を使用していますか? 'padding'を' enc'変数に設定していますが、エンコードに 'encaes'を使用しています。 –

+0

ええ、それは間違いです。 –

答えて

1

あなたはあなたのコードで多くの問題があります。

は、ここに私のコードです。

  • あなたがPaddingMode.Noneを使用する場合は、ブロック・サイズ(AESのための16バイト)の正確複数ある平文を供給する必要があります。したがって、任意の平文を単純に暗号化することはできません。暗号化と復号化にはPaddingMode.Pkcs7を使用してください。

  • あなたは暗号文が完全に書かれる前にそれを読んでいます。

    using (MemoryStream msEncrypt = new MemoryStream()) 
    { 
        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
        { 
         using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
         { 
          swEncrypt.Write(toEncStr); 
         } 
        } 
        encrypted = msEncrypt.ToArray(); 
    } 
    
  • あなたが暗号化に使用することができ、あまりにも多くの変数があります:あなたはusing (CryptoStream csEncrypt...ブロック後encrypted = msEncrypt.ToArray();を呼び出す必要があります。ちょうどちょうどAesのインスタンスが1つだけ必要です(enc)。 encaesProgramというコードを投げ捨て、encインスタンスから正しいKeyIVと書き込んでください。


IVは秘密ではありませんので、あなたは暗号文と一緒にそれを送ることができます。通常は、単純に暗号文の前に付加され、解読の前にスライスされます。

+0

ありがとう!不要な変数を削除し、 'PaddingMode'を' PKCS7'に変更しました。あなたが言ったように、うまくいきました! –

+0

別の問題が発生しました...コード 'RunDecrypt'と' myDecrypt'の解読部分を解読プログラムだけに置くと '解読に失敗しました!パディングは無効で、削除することはできません。どうしたのですか? –

+0

もう1つの質問ですが、.zipファイルまたはバイナリファイルを暗号化すると、ファイルサイズが増加し、ファイルが破損しました。 txtファイルのサイズだけが変更されないように見えますか? –

関連する問題