2009-08-04 10 views
8

Java CipherとAESを使用して暗号化/復号化を実装しています。 doFinal()の呼び出しで5バイトの余分なバイトが書き込まれていることを除いて、すべてうまくいっています。だから、私は5つの余分なバイトが追加された正しく復号された文字列で終わる。Java cipher.doFinal()余分なバイトを書き込む

私は、16バイトのブロック全体が書き込まれていると考えています。私は3つの16バイトのブロックが最後のものを含めて書かれているのを見る。入力暗号化ファイルは64バイトです。暗号化されていないテキストは43バイトでなければなりません。

doFinalのドキュメントは、出力バッファに書き込まれたバイト数を返すことができることを示しています。しかし、0,16,16,16です。私はdoFinalのすべてのフォームを試して更新し、動作に変更はありません。

これらのアルゴリズムのほとんどがどのように動作するのかという点で、フルブロックを書き出していることは意味があります。しかし、出力データのサイズを教えてくれない場合は、余分なデータをどうやって防ぐのですか?

別のアルゴリズムを使用しているはずですか? AES256は必須ですが、別のブロックタイプまたはパディングタイプで正しいバイト数を書き込めるかどうかは疑問です。

ガイダンスはありますか? (いくつかの)簡潔にするために切り取ら

:解読ルーチンの

decryptCipher = Cipher.getInstance("AES"); 
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey); 

ビジネス一環。すべてのブロック暗号れるように

long bytesToRead = inputFile.length(); 

    while ((inLen = in.read(buffer)) > 0) { 
     int bytesOut = 0; 
     byte[] cryptBytes = null; 
     int outLen = cipher.getOutputSize(inLen); 
     cryptBytes = new byte[outLen]; 

     if (bytesToRead <= buffer.length) { 
      try { 
       bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0); 
      } catch (ShortBufferException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } else 
      try { 
       bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0); 
      } catch (ShortBufferException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     out.write(cryptBytes, 0, bytesOut); 
     bytesToRead -= inLen; 

    } 
    try { 
     out.flush(); 
     in.close(); 
     out.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

答えて

14

Cipher.getInstance()を呼び出すときは、パディングメカニズムを指定する必要があります。明らかに、暗号化と復号化の両方の時間で同じでなければなりません。パディングメカニズムを使用しない場合、解読側は、平文の終わり(最後のブロック内)のどこに情報をもたない。

+0

すごく、ありがとう。それがそれを解決しました。私はあなたがAESのみを指定した場合、デフォルトでECBブロックモードとPCKS5Paddingを取得したという印象を受けました。間違っていると思います。 – wadesworld

+1

は、Java以外のすべてのAESエンジンにも同じことが適用されます。 – Cheeso

1

AESはブロック暗号あり、当然あなたの全体のブロックを与えるために起こっています。

詳細については、Wikipedia article on AESを参照してください。

「正しいバイト数」を出力したかったとします。正しいバイト数はどのように決定しましたか?

+1

私は彼がAESがそれをしていることを知っていると思います。疑問は、Java APIの使い方です。 – skaffman

+0

解読後の正しい暗号化されていないサイズを知るために、元のサイズをストリームに書き出す必要があります。 –

関連する問題