とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

JAVAで暗号化した文字列をPerlで複合化する方法

完全にはまりました、
今回の暗号化をJAVAでもPerlでも対応しているBlowfishで
やろう、ということになり、私はperlを実装していたのですが、
グーグル先生に聞いても全然資料がないorz

試行錯誤して、やっとできました。

ここに覚書として残します。

※ソースはセキュリティーの観点から部分的にしか乗せていません。
質問などはコメントにお願いします。

※※※まずはJAVA側※※※

javax.crypto.Cipher
javax.swing.JOptionPane
javax.crypto.spec.IvParameterSpec

をインポート。これはBlowfishを使うためのCryptoモジュールです。

String key = "cipher_key";

byte[] iv = "cipher_iv".getBytes();
IvParameterSpec ips = new IvParameterSpec(iv);

keyとivを設定
(これらはPerlとあわせる必要があります。)

Cipher.getInstance("Blowfish/CBC/PKCS5Padding");

JAVAのBlowfishはデフォルトでECBモードになっているのでこれをCBCに変更。
・PaddingはPerl側で実装可能な'standard'(PKCS5)に変更します。


この形で変換したものを16進数に再変換します。
(バイト数を数えて、まわしながら16進数に変換している)

これで、BlowfishのCBCモード変換したものが作られるわけです。

これを何かしらの方法でPerl側に送ります。


※※※PERL側※※※

以下二つのモジュールをダウンロードします。

CPAN -> http://search.cpan.org/

Crypt::CBC
Crypt::Blowfish_PP

※_PPってのはPurePerlって事です。

適当にインストールしてください。
(これはマシンによりまちまちなので記述しません。)


そして、CBC、Blowfishを宣言します。

use Crypt::Blowfish_PP;
use Crypt::CBC;

オブジェクトの作成

my $cipher = Crypt::CBC->new({'key'   => 'cipher_key',
               'cipher' => 'Blowfish_PP',
               'iv'   => 'cipher_iv',
               'regenerate_key'=> 0,
               'padding' => 'standard',
               'prepend_iv' => 0,
               });

・keyとivはJAVA側と一緒にする必要があります。
perlのpaddingをstandardにすることでPKCS5になります。


最後に複合化

$cipher->decrypt_hex($plainText)

・$plainTextにJAVAで暗号化した文字列を入れれば複合化されます。

                                                                                                                                                                                  • -

感想

面倒でした。
JAVAのBlowfishがデフォルトでECBを使っているあたりにやられました。
別言語間での暗号化、複合化についてはもう少し深そうですが、
今回はここら辺にしておきたいと思います。

なお、現在はkey,ivともにべたで書いていますが、
これらを隠蔽する作業が実装時には必要になります。




※この記事を参考に実装した際の損害、障害には一切の責任を負いかねます。
自己責任でよろしくお願いいたします。