PHP5.5から7.3へのバージョンアップ作業で、
既存サーバで使用している暗号化ライブラリがPHP7.3で非推奨の Crypt_Blowfish だったため、
推奨されている OpenSSL にリプレースする必要がありました。
作成した関数
まずは完成したコードから。
public function encrypt($plain_text)
{
// 暗号鍵の読込
$pass_phrase = 'angoukanokagiwoiretene';
// パディング処理
if ($m = strlen($plain_text) % 8)
{
$plain_text .= str_repeat("\x00", 8 - $m);
}
$encrypt = openssl_encrypt(
$plain_text,
'bf-ecb',
$pass_phrase,
OPENSSL_RAW_DATA | OPENSSL_NO_PADDING
);
return base64_encode($encrypt);
}
public function decrypt($encrypted_text)
{
// 暗号鍵の読込
$pass_phrase = 'angoukanokagiwoiretene';
$decrypt = trim(
openssl_decrypt(
base64_decode($encrypted_text),
'bf-ecb',
$pass_phrase,
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
)
);
return $decrypt;
}
シンプルなコードですが、この形になるまでに色々とつまずきました。
つまずいた項目
パディング処理の実装
テキストをパディングしてから暗号化する事は分かっていましたが、
見つけたサンプルコードもそれぞれ違う実装のため右往左往していました。
私の場合は下記ページの実装方法がドンピシャでした。
第二引数 暗号メソッド(cipher_algo)はどれなのか
正解はECBモードだったのですが、
CBCモードだと思い込んでいて気付くまで時間が掛かりました。
第四引数 指定するoptionsは何か(openssl_encrypt)
OPENSSL_RAW_DATA と OPENSSL_ZERO_PADDING のビット OR。
リファレンスでは上記の説明でしたが、
下記ページを参考に OPENSSL_NO_PADDING を指定し、
パディング除去が行われないようにする必要がありました。
第五引数 初期化ベクトル(Initialization Vector)が不要だった
BlowfishでIVを渡して使用していたため、
OpenSSLにリプレースする場合も第五引数にIVを渡すのが必須だと思い込んでいました。
Blowfishで使用していたIVをそのまま渡すと長さが違うと怒られるので、
IVにも何かしら処理を加えて渡さないといけないのか?と悩んでいました。
参考ページ