2012-01-25 13 views
3

AESを使用してJavaアプリケーションで暗号化されたファイルがあります。私はまた、キーファイルを暗号化しています。しかし、私はどのようにキーを使用してファイルを解読するのか理解できません。ほとんどのチュートリアルや例では、一時的なランダムキーを作成し、ファイルを暗号化し、1か所で解読します。 したがって、質問はどのように解読に使用する必要があるキーを指定するのですか?JavaでAES暗号化ファイルを解読する

編集: サンプル私はキーを生成するために次のコードを使用しています。私はここで私の鍵をどこで使うことができるのか分かりません。

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
+2

あなただけのランダムキーの代わりに、チュートリアルにあなたの鍵をドロップすることができませんか?または、実際にパスワードと塩をキービットに変換する必要がありますか?あなたが見ている同じチュートリアルとして私たちを指しているなら(そして/またはここでコードの一部を引用する)、私たちはそれを変更する方法を理解するのに役立つかもしれません。 – Rup

+0

上記の私の編集を参照してください –

+0

@RupこれはバイトをJava Keyインスタンスに変換する必要がある小さな変換の問題だと思います。 –

答えて

2

ルシファーの答えに私のコメントを要約するだけです。

  1. 暗号化に使用されたパディングがわからない場合は、「パディングなし」の設定で復号化してください。これは、パディングを含むすべてを解読し、不一致のパディングのためにエラーをスローしません。

  2. サイファーテキストを復号化したら、出力の最後のブロックを見て、使用されたパディングを確認します。異なるパディングには異なるバイトパターンが残るため、通常は分かりやすいほど簡単です。

  3. 正しいパディングタイプが予想されるように復号方法を設定すると、自動的に削除されます。

+0

ありがとうございます。復号結果はGZIP-edであることが判明しました。今私は結果を期待している。再度、感謝します! –

+1

UNIXの熟練者にとっては、決して分からない出力に対して "file"コマンドを実行することに傷つくことはありません... –

0

お手数ですが、以下の方法をお試しください。

private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) 
     throws Exception 
{ 
    int minSize = cipher.getOutputSize(data.length); 
    byte[] outBuf = new byte[minSize]; 
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); 
    int length2 = cipher.doFinal(outBuf, length1); 
    int actualLength = length1 + length2; 
    byte[] result = new byte[actualLength]; 
    System.arraycopy(outBuf, 0, result, 0, result.length); 
    return result; 
} 

private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception 
{ 
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
      new AESEngine())); 
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); 
    aes.init(false, ivAndKey); 
    return cipherData(aes, cipher); 
} 

private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception 
{ 
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
      new AESEngine())); 
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); 
    aes.init(true, ivAndKey); 
    return cipherData(aes, plain); 
} 
+0

私は "org.bouncycastle.crypto.InvalidCipherTextException:pad block corrupted"を持っています。 –

+0

暗号化と同じパディングを復号化に指定していることを確認してください。あなたがわからない場合は、解読に「パディングなし」を指定し、最後のブロックの終わりを見て、どのパディングが暗号化に使用されているかを判断します。 – rossum

+0

@rossum:私が暗号化に使用したパディングを知っていれば。 –

2

このようSecretKeySpecにバイトとして答えは、単に鍵データを配置することができます:あなたはCipher.init()方法でそれを直接使用できるようにSecretKeySpecは、Keyインタフェースを実装していること

SecretKeySpec aesKey = new SecretKeySpec(myKeyData, "AES"); 

注意。そのため、SecretKeyFactoryは必要ありません。

+0

ありがとう、これは役に立ちます。私はファイルを復号化しましたが、内容はバイナリ混乱です。私は間違ったことをしたことは明らかです。 –

+0

メッセージ全体が混乱しているのではなく、最初の16バイトですか?あなたは私たちに、使用されているアルゴリズムと、IVベクトル(mode = CBCの場合)を指定した場合の情報をもう少し教えてください。どのような詰め物ですか?これらは 'Cipher.getInstance();' –

+0

で指定します。私が解読したいファイルは、HSQLDBデータベースの.scriptファイルです。通常、変更ログを含むプレーンテキストファイルです。しかし、いくつかの男は[リンク](http://www.coderanch.com/t/515884/JDBC/java/Encrypted-database-HSQL)で説明されているようなデータベースの暗号化を使用することに決めました。何とかデータベースが壊れていて、クライアントがデータを復元しようとしています。だから私は暗号化に使用される暗号化オプションhsqldbを知らない。 DBエンジンに与えられるパラメータは "AES"と128ビットのキーです。 –

0

暗号化/ JavaのOutOfMemoryExceptionを投げると初期化ベクトル生成用のJava SecureRandomを使用せずに巨大な映像を復号化の完全な例に。また、キーバイトをデータベースに格納し、それらのバイトから同じキーを再構築する方法についても説明します。

https://stackoverflow.com/a/18892960/185022

関連する問題