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ともにべたで書いていますが、
これらを隠蔽する作業が実装時には必要になります。
※この記事を参考に実装した際の損害、障害には一切の責任を負いかねます。
自己責任でよろしくお願いいたします。