PHP版DESアルゴリズム暗号化データ(3 DES)openssl_を添付encryptバージョン

19869 ワード

PHP版DESアルゴリズム暗号化データ(3 DES)
JavaのDES(DESede/CCB/PCC 5 Padding)暗号化方式と互換性がある
php
/**
 * Created by PhpStorm.
 * Title:PHP DES    
 *          java DES(DESede/CBC/PKCS5Padding)      
 * User: yaokai
 * Date: 2017/11/13 0013
 * Time: 19:03
 */
 
namespace App\Http\Libs;
 
 
class Des
{
    private static $_instance = NULL;
    var $key;//    
    var $iv;//     ->   
 
    function __construct()
    {
        $this->key = env('DES_KEY');
        $this->iv = env('DES_IV');
    }
 
    /**
     *
     * @User yaokai
     * @return Des|null
     */
    public static function share()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new Des();
        }
        return self::$_instance;
    }
 
    /**
     *     
     * @User yaokai
     * @param $input       
     * @return string          
     */
    function encrypt($input)
    {
        //             8
        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); //3DES   MCRYPT_DES  MCRYPT_3DES
        //ascii   
        $input = $this->pkcs5_pad($input, $size); //    PaddingPKCS7,    PaddingPKCS7  。
        // 0         8
        $key = str_pad($this->key, 8, '0'); //3DES   8  24
        //            
        $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
        //          
        if ($this->iv == '') {
            //            
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//  b"¨ß^\f\x1EÅ╩5"
        } else {
            //          
            $iv = $this->iv;
        }
        //           
        @mcrypt_generic_init($td, $key, $iv);
        //      $td         $input       
        $data = mcrypt_generic($td, $input);//   b"ýyP\x7FN\x00èiÝd>À?s\x18Î"
        //           
        mcrypt_generic_deinit($td);
        //      
        mcrypt_module_close($td);
        //   MIME base64        
        $data = base64_encode($data);//           bin2hex   
        //                                         
        return $data;
    }
 
 
    /**
     *     
     * @User yaokai
     * @param $encrypted        
     * @return bool|string
     */
    function decrypt($encrypted)
    {
        //    MIME base64          
        $encrypted = base64_decode($encrypted); //           bin2hex   
        //                       
        $key = str_pad($this->key, 8, '0'); //3DES   8  24
        //            
        $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');//3DES   MCRYPT_DES  MCRYPT_3DES
        //          
        if ($this->iv == '') {
            //            
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            //          
            $iv = $this->iv;
        }
        //                     
        $ks = mcrypt_enc_get_key_size($td);//DES 8   3DES 24
        //           
        @mcrypt_generic_init($td, $key, $iv);
        //      $td         $encrypted        
        $decrypted = mdecrypt_generic($td, $encrypted);//    "15549070665\x05\x05\x05\x05\x05"        
        //           
        mcrypt_generic_deinit($td);
        //      
        mcrypt_module_close($td);
        //        
        $data = $this->pkcs5_unpad($decrypted);
 
        return $data;
    }
 
    /**
     *          
     * PKCS7Padding VS PKCS5Padding
     *   ,PKCS5Padding blocksize 8  , PKCS7Padding blocksize   1 255  
     * @User yaokai
     * @param $text
     * @param $blocksize
     * @return string
     */
    function pkcs5_pad($text, $blocksize)
    {
        //$pad=5  blocksize=11  $test=8  %  
        $pad = $blocksize - (strlen($text) % $blocksize);//5
        //  ascii       ,    "15549070665\x05\x05\x05\x05\x05"
        return $text . str_repeat(chr($pad), $pad);
    }
 
    /**
     *           
     * PKCS7Padding VS PKCS5Padding
     *   ,PKCS5Padding blocksize 8  , PKCS7Padding blocksize   1 255  
     * @User yaokai
     * @param $text
     * @return bool|string
     */
    function pkcs5_unpad($text)
    {
        //          {15}   ord      ASCII   
        $pad = ord($text{strlen($text) - 1});//5
        //  $pad           
        if ($pad > strlen($text)) {
            //         
            return false;
        }
        //  ASCII            $text                     $pad
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            //          
            return false;
        }
        //        
        return substr($text, 0, -1 * $pad);
    }
 
 
    /**
     *          
     * PKCS7Padding VS PKCS5Padding
     *   ,PKCS5Padding blocksize 8  , PKCS7Padding blocksize   1 255  
     * @User yaokai
     * @param $text
     * @param $blocksize
     * @return string
     */
    function PaddingPKCS7($data)
    {
        $block_size = mcrypt_get_block_size(MCRYPTDES, MCRYPT_MODE_CBC);//3DES   MCRYPT_DES  MCRYPT_3DES
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }
 
 
    /**
     *           
     * PKCS7Padding VS PKCS5Padding
     *   ,PKCS5Padding blocksize 8  , PKCS7Padding blocksize   1 255  
     * @User yaokai
     * @param $text
     * @return bool|string
     */
    private function UnPaddingPKCS7($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);
    }
 
 
}

 
php 7のため.1 mcrypt_*を破棄しました一連の関数なのでopensslバージョンを採用します
/**
* des3  
* @author bug  <[email protected]>
* @createtime 2019-04-17 17:30:53
* @param $str       
* @param $des_key     
* @param $des_iv      ->   
* @return 
*/
if(!function_exists('des3_encrypt')){
  function des3_encrypt($str,$des_key="",$des_iv="")
  {
      return base64_encode(openssl_encrypt($str, 'des-ede3-cbc', $des_key, OPENSSL_RAW_DATA, $des_iv));
  }
}

 
csdn版主に感謝しますhttps://blog.csdn.net/xzykai/article/details/78932206
権利侵害があれば削除・修正に連絡してください