php-des-aes加解密可对接java

php-des-aes加解密支持各种 PHP 版本,可对接java(并附java代码)

DES 加密类

/**
 * openssl 实现的 DES 加密类,支持各种 PHP 版本
 */
class OpenSSLDES
{
    /**
     * var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得
     * ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可)
     * CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
     * CFB DES-CFB8、DES-EDE3-CFB8
     * CTR
     * OFB
     */
    protected $method;

    /**
     * var string $key 加解密的密钥
     */
    protected $key;


    /**
     * var string $iv 加解密的向量
     */
    protected $iv;

    /**
     * var string $options
     * 1.0
     * 2.OPENSSL_RAW_DATA=1  【会用PKCS#7进行补位】
     * 3.OPENSSL_ZERO_PADDING=2
     * 4.OPENSSL_NO_PADDING=3
     */
    protected $options;


    /**
     * DES constructor.
     * @param string $key 密钥
     * @param string $method 加密方式
     * @param int $options  数据格式选项
     * @param string $iv   iv向量
     */
    public function __construct($key,$method = 'DES-ECB',$options = OPENSSL_NO_PADDING,$iv = '')
    {
        $this->key     = $key;
        $this->method  = $method;
        $this->options = $options;
        $this->iv      = $iv;
    }

    /**
     * 加密
     * @param $data
     * @return string
     */
    public function encrypt($data)
    {
        $iv         = $this->vi_cheap($this->key);//获取偏移量
        $secret_key = $iv;
        $pkcs       = $this->pkcs5_pad($data);//填充

        //$mcrypt  = openssl_encrypt($pkcs, $this->method,$secret_key, $this->options, $iv);//新老版本结果有出入
        $mcrypt  = mcrypt_encrypt(MCRYPT_DES, $secret_key, $pkcs, MCRYPT_MODE_CBC, $iv);
        $encrypt = $this->strToHex($mcrypt); //转成大写的16进制字符串

        return $encrypt;
    }

    /**
     * 解密
     * @param $data
     * @return string
     */
    public function decrypt($data)
    {
        $iv         = $this->vi_cheap($this->key);//获取偏移量
        $secret_key = $iv;
        $strToHex   = $this->hexToStr($data); //大写的16进制字符串转成字符串

        //$mcrypt    = openssl_decrypt($strToHex, $this->method, $secret_key, $this->options, $iv);
        $mcrypt  = mcrypt_decrypt(MCRYPT_DES, $secret_key, $strToHex, MCRYPT_MODE_CBC, $iv);
        $unpad   = $this->unpad($mcrypt);//去除加密填补的字符串
        $decrypt = rtrim($unpad);

        return $decrypt;
    }

    /**
     * PKCS5Padding填充
     * PKCS5Padding的blocksize为8字节
     * @param $text
     * $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
     * @return string
     */
    public  function pkcs5_pad($text) {
        $pad = 8 - (strlen($text) % 8);
        return $text . str_repeat(chr($pad), $pad);
    }

    /**
     * PKCS7Padding填充
     * PKCS7Padding的blocksize可以为1到255字节,8字节时PKCS7Padding与PKCS5Padding结果相同
     * $block_size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
     * @return string
     */
    public  function pkcs7_pad($text,$blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }

    /**
     * 去除加密填补的字符串
     * @param $text
     * @return bool|string
     */
    public  function unpad($text){
        $pad = ord(substr($text, -1));//取最后一个字符的ASCII 码值
        if ($pad < 1 || $pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, (strlen($text) - $pad));
    }

    /**
     * 偏移量获取
     * @param $key
     * @return bool|string
     */
    public function vi_cheap($key){
        $md5         = md5($key);
        $strtoupper  = strtoupper($md5);//处理成大写
        $key_sixteen = substr($strtoupper,0,16);//截取16位
        $secret      = substr($key_sixteen,0,8);//截取8位
        return $secret;
    }

    /**
     * 字符串转大写的16进制字符串
     * @param string $hex
     */
    public function strToHex($hex) {
        $str = "";
        $bin2hex = bin2hex($hex); //把 ASCII 字符的字符串转换为十六进制值
        $str     = strtoupper($bin2hex);//转大写
        return $str;
    }

    /**
     * 大写的16进制字符串转字符串
     * @param string $hex
     */
    public function hexToStr($hex) {
        $str = "";
        $strtolower = strtolower($hex); //转小写
        $str        = pack('H*',$strtolower);//把数据装入一个二进制字符串
        return $str;
    }



}

$key = 'xxxxxx';
$str = '123456';

// DES CBC 加解密
$des = new OpenSSLDES($key,'DES-CBC');
$encrypted = $des->encrypt($str);
echo 'des ++:'.$encrypted. '
'
; // $decrypted = $des->decrypt($encrypted); echo 'des --:'.$decrypted;die;

AES 加密类



/**
 * openssl 实现的 AES 加密类,支持各种 PHP 版本
 */
class OpenSSLAES
{
    /**
     * var string $method 加解密方法,可通过openssl_get_cipher_methods()获得
     * AES-128-ECB,AES-192-ECB,AES-256-ECB
     * AES-128-CBC,AES-192-CBC,AES-256-CBC
     * AES-128-CTR,.....
     * AES-128-OFB,.....
     * AES-128-CFB,.....
     */
    protected $method;

    /**
     * var string $secret_key 加解密的密钥
     */
    protected $key;

    /**
     * var string $options 数据格式选项
     * 1.0
     * 2.OPENSSL_RAW_DATA=1  【默认用PKCS#7进行补位填充】
     * 3.OPENSSL_ZERO_PADDING=2
     * 4.OPENSSL_NO_PADDING=3
     */
    protected $options;

    /**
     * var string $iv 加解密的向量,ECB加密模式下iv无需填写,可以为0 有些方法需要设置比如CBC
     */
    protected $iv;

    /**
     * 使用 AEAD 密码模式(GCM 或 CCM)时传引用的验证标签(可选)
     */
    protected $tag;

    /**
     * 附加的验证数据。(可选)
     */
    protected $aad;

    /**
     * 验证 tag 的长度。GCM 模式时,它的范围是 4 到 16(可选)
     */
    protected $tag_length;


    /**
     * 构造函数
     *
     * @param string $key 密钥
     * @param string $method 加密方式
     * @param mixed $options 数据格式选项
     * @param string $iv iv向量
     *
     */
    public function __construct($key,$method = 'AES-128-ECB',$options = OPENSSL_RAW_DATA,$iv = '')
    {
        // key是必须的
        $this->key     = isset($key) ? $key : '12345678';
        $this->method  = $method;
        $this->options = $options;
        $this->iv      = $iv;
    }

    /**
     * 加密方法,对数据进行加密,返回加密后的数据
     * @param string $data 要加密的数据
     * @return string
     *
     */
    public function encrypt($data)
    {
        $key     = $this->hexToStr($this->key); //字符串转十六进制
        $encrypt = openssl_encrypt($data, $this->method, $key, $this->options, $this->iv);
        return base64_encode($encrypt);
    }

    /**
     * 解密方法,对数据进行解密,返回解密后的数据
     * @param string $data 要解密的数据
     * @return string
     *
     */
    public function decrypt($data)
    {
        $key       = $this->hexToStr($this->key); //字符串转十六进制
        $decrypted = base64_decode($data);
        return openssl_decrypt($decrypted, $this->method, $key, $this->options, $this->iv);
    }

    /**
     * 字符串转大写的16进制字符串
     * @param string $hex
     */
    public function strToHex($hex) {
        $str = "";
        $bin2hex = bin2hex($hex); //把 ASCII 字符的字符串转换为十六进制值
        $str     = strtoupper($bin2hex);//转大写
        return $str;
    }

    /**
     * 大写的16进制字符串转字符串
     * @param string $hex
     */
    public function hexToStr($hex) {
        $str = "";
        $strtolower = strtolower($hex); //转小写
        $str        = pack('H*',$strtolower);//把数据装入一个二进制字符串
        return $str;
    }

}

$aes = new OpenSSLAES('4f5dsfds2fd4sf4dfwujjj');
$encrypted = $aes->encrypt('1');//==
echo 'aes ++:'.$encrypted, '
'
; $decrypted = $aes->decrypt($encrypted); echo 'aes --:'.$decrypted;die;

Java的demo包链接:https://download.csdn.net/download/qq_36993916/86025692

你可能感兴趣的:(PHP,java,php,开发语言)