PHPで暗号化(BlowfishのPKCS5Padding方式)

追記(2011/4/7)
なんかAndroidさんBlowfishサポートしてないくさい\(^o^)/
他の暗号化形式はいけるんだろうか…。久々にきれちまったよ…。

アンドロイドアプリを作る勉強をスーパースローペースで進めているんですが、
飽きてきたので、えごりぶ用の作るとなるとAPI作らないといけないなーと思い、仕様をモヤモヤと考えていたんですが、暗号化で通信する必要がありそうな箇所があったので、PHPで暗号化する方法を調べました。

PHPmcryptっていう拡張モジュール(使ってるのはPHP5.3なので最初からmcryptは入っているようでした。)で主要な暗号方式をフォローしているようですが、パディング方式が選べず、ZeroPadding方式になってしまうらしい。パディング方式がなにかってのはggr。というか僕も説明できるほど理解してないけど。

Javaの方はというとパディング方式が選べるんですが、どうも下記サイトを見るとZeroPadding方式がないっぽい。\(^o^)/
http://www.trustss.co.jp/Java/JEncrypt100.html


で、下記サイトにまさに僕がやりたいことを既にやろうとしている人がいて、詳しく書いてあったので参考に。

http://d.hatena.ne.jp/pasela/20100612/crypto#20100612f3

そしてここ読んでたら、PHPPKCS5Padding方式でパディングする方法も載ってたのでコピペしつつ作れました。さっくりと。うそ、めんどかった。
ソースは下記。BlowfishのECBモードで変換してます。また、暗号化したバイナリは16進数の文字列にしてます。

<?php

function encrypt($key , $text){
	$size = mcrypt_get_block_size('blowfish', 'ecb');
	$input = pkcs5_pad($text, $size);
	$td = mcrypt_module_open('blowfish', '', 'ecb', '');
	$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
	mcrypt_generic_init($td, $key , $iv);
	$data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	//16進数の文字列にする
	$data = bin2hex($data);
	return $data;
}
	

function decrypt($key , $text){
	$td = mcrypt_module_open('blowfish', '', 'ecb', '');
	//16進数の文字列をバイナリにする
	$data = pack("H*" , $text);
	$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); 
	mcrypt_generic_init($td, $key , $iv);
		
	$data = mdecrypt_generic($td, $data);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
		
	$data = pkcs5_unpad($data);
	return $data;
}

function pkcs5_pad ($text, $blocksize){
	$pad = $blocksize - (strlen($text) % $blocksize);
	return $text . str_repeat(chr($pad), $pad);
}

function pkcs5_unpad($text){
	$pad = ord($text{strlen($text)-1});
	if ($pad > strlen($text)) return false;
	if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
	return substr($text, 0, -1 * $pad);
}

でも実際使うかどうかは謎。そもそもAndoroidアプリが出来上がるかどうかも謎。