PHP版DESアルゴリズム暗号化データ(3 DES)openssl_を添付encryptバージョン
19869 ワード
PHP版DESアルゴリズム暗号化データ(3 DES)
JavaのDES(DESede/CCB/PCC 5 Padding)暗号化方式と互換性がある
php 7のため.1 mcrypt_*を破棄しました一連の関数なのでopensslバージョンを採用します
csdn版主に感謝しますhttps://blog.csdn.net/xzykai/article/details/78932206
権利侵害があれば削除・修正に連絡してください
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
権利侵害があれば削除・修正に連絡してください