2017-01-04 10 views
0

を返します。次のルーチンで.NETのRijndaelManagedクラスを使用してこのファイルを復号化します。OpenSSLは、私は、バイナリAES暗号化されたファイルを持っている私のLinuxマシンでは不正なマジックナンバー

public static bool decryptFile(string inputFile, string outputFile) 
    { 
     string s = "h3y_gUyZ"; 
     UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); 
     byte[] bytes = unicodeEncoding.GetBytes(s); 
     FileStream fileStream = new FileStream(inputFile, FileMode.Open); 
     RijndaelManaged rijndaelManaged = new RijndaelManaged(); 
     CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read); 
     FileStream fileStream2 = new FileStream(outputFile, FileMode.Create); 
     try 
     { 
      int num; 
      while ((num = cryptoStream.ReadByte()) != -1) 
      { 
      fileStream2.WriteByte((byte)num); 
      } 
      fileStream2.Close(); 
      cryptoStream.Close(); 
      fileStream.Close(); 
     } 
     catch 
     { 
      fileStream2.Close(); 
      fileStream.Close(); 
      File.Delete(outputFile); 
      return true; 
     } 
      return false; 
    } 

Linux私はこのコードをC#プログラムに埋め込みました。モノで、mcsでコンパイルした後です。 Dパラメータは、前述の機能を実行

mcs *.cs -out:mybinary.exe 
mono mybinary.exe d Leela_Turanga.plr outputfile.dat 

Leela_Turanga.plrを解読するファイルと outputfile.dat で得decrypedファイルです。 これはうまくいきます:私はファイルを正しく解読することができ、人間が読めるテキストが解読されたファイルに現れるので、これを言うことができます。 今、私はopensslと同じファイルを解読したいと思います。

  • キーサイズ
  • AESの動作モード(CBC、ECB、PCBC、CFB:私は、アルゴリズムパラメータを取得する必要があり、そして作品上記のコード以来、私は私にこれらの情報を与えるためにそれを変更されたすべての ファーストいくつかのコードを追加することで...)
  • パディング(それが何であるか見当がつかない)

public static bool decryptFile(string inputFile, string outputFile) 
    { 
     string s = "h3y_gUyZ"; 
     UnicodeEncoding unicodeEncoding = new UnicodeEncoding(); 
     byte[] bytes = unicodeEncoding.GetBytes(s); 
     FileStream fileStream = new FileStream(inputFile, FileMode.Open); 
     RijndaelManaged rijndaelManaged = new RijndaelManaged(); 
     CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read); 
     FileStream fileStream2 = new FileStream(outputFile, FileMode.Create); 


     //=======DEBUG INFO======= 
     //PRINT ALGORITHM SETTINGS 
     Console.WriteLine(rijndaelManaged.Mode); //what AES mode are we using? 
     Console.WriteLine(rijndaelManaged.KeySize); //what is the keysize? 
     Console.WriteLine(rijndaelManaged.Padding); //what is the padding? 
     //======================== 


     try 
     { 
      int num; 
      while ((num = cryptoStream.ReadByte()) != -1) 
      { 
      fileStream2.WriteByte((byte)num); 
      } 
      fileStream2.Close(); 
      cryptoStream.Close(); 
      fileStream.Close(); 
     } 
     catch 
     { 
      fileStream2.Close(); 
      fileStream.Close(); 
      File.Delete(outputFile); 
      return true; 
     } 
      return false; 
    } 

RijndaelManagedがCBCモードで256ビット鍵とPKCS7パディング(重要であるかどうかはもう分かりません)を使って作業しています。 は、今私は解読するためにOpenSSLを使用して試すことができます:

openssl enc -aes-256-cbc -d -in Leela_Turanga.plr -out out.bin 

そして、パスワードプロンプトは、私はパスを入力し、表示され、「悪いマジックナンバー」エラーが

enter aes-256-cbc decryption password: 
bad magic number 

」返さないと私は何を取得しています復号化されたファイル

なぜOpenSSLは、私はインターネット上で検索しましたが、私は私の答えを見つけていないことを言うん

も:。?。 C#の文字列はUTF-16(したがって16ビットのchar)でエンコードされ、キーは8文字である "h3y_gUyZ"であるため、16 x 8 = 128ビットの幅にするべきではありませんか? 256 rijndaelManaged.KeySizeの代わりに戻ります。

+2

パスワードをキーとして使用し、キーをIVとして使用することは安全ではないことに注意してください。キーはパスワードなどから導き出されるべきです。 'Rfc2898DeriveBytes'を使用し、IVはランダムと区別できません。 –

答えて

1

なぜopensslはそれを言っていますか?

OpenSSLは、塩をとるEVP_BytesToKeyという独自のキー導出ルーチンを使用します。この塩にはASCIIコードで8バイトの魔法の接頭語「Salted__」が付いています。パスワードはキーとして直接使用するべきではないので、OpenSSLはそれらをキーに最初に変換します。

代わりに、-Kと文字列の16進表現(エンコードのために読み込まれた)を使用してキーを提供することができます。また、IV(あなたの場合は同じバイト)を提供する必要があります。 C#の文字列であるので

は、UTF-16(チャー中したがって16ビット)で符号化され、キーは8つの文字である"h3y_gUyZ"であり、キーは16×8 = 128ビット幅の代わりにすべきではありませんが返されますか?

はい、おそらくあなたは、キーとそれを初期化する前に、キーのサイズのためのラインダールクラスを尋ねました。また、エコシステム全体がリトルエンディアンであるため、.NETはUTF-16LE(リトルエンディアン)を使用しています。


PKCS#7 パディング方式が含まれていることを標準です。どちらも.NETとOpenSSLで使用されていますので、問題ありません。 ECBとCBCモードでは、暗号の入力サイズを暗号のブロックサイズのN倍にする必要があります。したがって、PKCS#7は、\x01\x10の1〜16バイト(AESのブロックサイズ)を追加します。アンパディングはこれらを削除します。

関連する問題