- PR -

復号時にゴミ

1
投稿者投稿内容
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 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) {
}
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-01-18 19:16
ブロックモードだったらパディングが入るのは当然です。

元のサイズもファイルに記録するようにするとか、ストリームモードを使うとかが必要ですね。
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 2007-01-19 10:49
返信ありがとうございます。

データの終端ブロックで doFinale() を行えばパディング分は返らないので
勝手に「何か良い方法があるのではないか?」と思った次第です。

実際はソケットのやり取りで送られてくる総量が不明なデータを想定しているのですが
モードやそれらも含めて、もう少し検討してみます。
1

スキルアップ/キャリアアップ(JOB@IT)