##前提
- PHP7
- 送信側はShift-JIS、受信側はUTF-8
- 送信側は下記の流れで暗号化して送信してくる。(某決済代行サイト)
- 3DES-CBC(Padding なし)にエンコード
- BASE64にエンコード
- 送信!!!
##コード
decode.php
public function do($str){
$iv = '初期化ベクトル';
$password = '秘密キー';
$method = 'des-ede3-cbc'; //3DES-CBCの設定(DES-CBCの場合、des-cbc)
$decodeTarget = base64_decode($str)
$result = openssl_decrypt(
$decodeTarget, //①
$method, //②
$password, //③
OPENSSL_NO_PADDING, //④
$iv //⑤
);
return mb_convert_encoding($result, 'UTF-8','Shift_JIS');
//TRIMするならtrim($result)
}
###解説
openssl_decrypt(
'①:復号対象',
'②:暗号メソッド',
'③:秘密キー',
'④:オプション',
'⑤:初期化ベクトル'
);
phpマニュアル:openssl_decrypt
「②:暗号メソッド」:openssl_get_cipher_methods()にて利用できるメソッドは確認可能1
「④:オプション」:マニュアルには下記の様に書かれており、
OPENSSL_RAW_DATA:行データ、
OPENSSL_ZERO_PADDING:Paddingなし
という認識。(0も指定可能みたい2)
OPENSSL_RAW_DATA あるいは OPENSSL_ZERO_PADDING のいずれか。
##雑記
mcryptで書かれているコードは見つけたが、PHP7では非推奨のため使えない。(PHP7.2より前なら使用可能3)
ということで、opensslでと探したが無くて苦労しました;;
記載内容に間違いがあれば、ご指摘いただけると幸いです。