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