- - PR -
復号時にゴミ
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-01-18 18:50
お世話になります。
javax.crypto.Cipher を使って暗号化した複数のデータを復号する際に ゴミデータが入るのですが何か良い方法があるでしょうか? 例としては、共通鍵は適当に受け渡し(本件では問題ではない) 複数回 doFinal() されたファイルを共通鍵を使って復号してみると ブロック単位に復号しようが一括で復号しようがデータとデータの間に パディングデータ(ゴミ)が入って取得されます。 ※復号側は鍵だけでデータの詳細は知らない ※ブロック暗号方式 宜しくお願いします。 サンプルコード KeyGenerator keyGen = null; keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey commonKey0 = keyGen.generateKey(); byte commonKeyByte[] = commonKey0.getEncoded(); SecretKey commonKey = new SecretKeySpec(commonKeyByte, "AES"); Cipher cCipherDec = Cipher.getInstance("AES"); cCipherDec.init(Cipher.DECRYPT_MODE, commonKey); Cipher cCipherEnc = Cipher.getInstance("AES"); cCipherEnc.init(Cipher.ENCRYPT_MODE, commonKey); java.io.FileOutputStream dout = null; try{ dout = new java.io.FileOutputStream("data.dat"); byte[] encData = cCipherEnc.doFinal( (new String("abcdefghij").getBytes())); dout.write(encData); dout.flush(); encData = cCipherEnc.doFinal( (new String("123456798012345678901234567890").getBytes())); dout.write(encData); dout.flush(); encData = cCipherEnc.doFinal( (new String("klmnopqrst").getBytes())); dout.write(encData); dout.flush(); encData = cCipherEnc.doFinal( (new String("uvwxyz").getBytes())); dout.write(encData); dout.flush(); dout.close(); java.io.FileInputStream inStream = new java.io.FileInputStream("data.dat"); byte[] byData = new byte[200]; int nReadSize = inStream.read(byData); int nBlockSize = cCipherDec.getBlockSize(); for(int nLoop=0; nLoop<nReadSize/nBlockSize; nLoop++){ byte[] decData = null; decData = cCipherDec.update(byData, nLoop*nBlockSize, nBlockSize); } inStream.close(); }catch(javax.crypto.BadPaddingException e){ }catch(javax.crypto.IllegalBlockSizeException e){ }catch (java.io.IOException e) { } |
|
投稿日時: 2007-01-18 19:16
ブロックモードだったらパディングが入るのは当然です。
元のサイズもファイルに記録するようにするとか、ストリームモードを使うとかが必要ですね。 |
|
投稿日時: 2007-01-19 10:49
返信ありがとうございます。
データの終端ブロックで doFinale() を行えばパディング分は返らないので 勝手に「何か良い方法があるのではないか?」と思った次第です。 実際はソケットのやり取りで送られてくる総量が不明なデータを想定しているのですが モードやそれらも含めて、もう少し検討してみます。 |
1