LoginSignup
4
4

More than 5 years have passed since last update.

3DES-CBCの復号(Padding なし)

Last updated at Posted at 2018-03-05

前提

  • PHP7
  • 送信側はShift-JIS、受信側はUTF-8
  • 送信側は下記の流れで暗号化して送信してくる。(某決済代行サイト) 
    1. 3DES-CBC(Padding なし)にエンコード
    2. BASE64にエンコード
    3. 送信!!!

コード

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でと探したが無くて苦労しました;;

記載内容に間違いがあれば、ご指摘いただけると幸いです。


4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4