Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

鍵交換で生成した秘密鍵による暗号化

表題そのままですが、鍵交換(Diffie-Hellman)で生成した秘密鍵を用いて"Hoge, World!"を暗号化し、復号化しようとすると、
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
となったり、
メリw貨ヒBrld!
となったり(文字化け)、時々成功して、
Hoge, World!
となったりします。

双方の鍵が異なっているのかと思い、バイト列を比べてみたのですが、バイト列は一致しました。

あと、デフォルトのECBモードを使用しているのですが、これもCBCモードに変えたいのですが、復号化側でCipherオブジェクトをinitする際、暗号側でのパラメータが必要になります。このパラメータの受け渡しはどうすればいいのでしょうか?さすがにそのままネットワークに流すわけにもいきませんし、かといってこれなしには復号化できません。

どちらか片方だけでもよいので、ご教示ください。

3

回答

98966

閲覧

3件の回答

評価

0

CBCモードについて、少し調べてみました。
問題のIVについては、秘密にする必要はないとの文献を見つけました。
ただ、セッションをまたがって IV を再利用せず、セッションを開始するたびに新しいIVを使うのが良いようです。
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO.txt

あと、復号化ですが鍵が同じなら成功するはずですがjavax.crypto.BadPaddingException
とあるので、平文の文字数がブロック長の倍数になっていないのではないでしょうか?
空白を埋めるなどの処理が必要かもしれません。
参考:
http://nienie.com/~masapico/crypt1.html

評価

0

ありがとうございました。
CBCモードのIVって秘密にする必要なかったんですね。
勉強になりました。

パディングについては、アルゴリズム、モードとともに指定するPKCS5Paddingというものを使っているのですが、これは勝手にパディングしてくれるものだと思ってましたが、違うんでしょうか?
なぜかCBCモードを指定するとパディング関連のエラーが出なくなります。

CBC/PKCS5Paddingを指定したらとりあえずうまくいったので、この方法を検討してみます。

評価

0

>モードとともに指定するPKCS5Paddingというものを使っているのですが

なるほど、失礼しました。
パディングしているのにエラーが出るのは、行うことの重要さを考えると、いやな感じですね・・

軽くしかタッチしていないのですが、このエラーは始めてみました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。