php7之后的版本

php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.

function encrypt($input)
{
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
$size = 16;
$k = C('KEY_LONG');
$input = pkcs5_pad($input, $size); $data = openssl_encrypt($input, 'AES-128-CBC', $k, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $k);
} else {
$size = 8;
$k = C('KEY_SHORT');
$input = pkcs5_pad($input, $size); $td = mcrypt_module_open(MCRYPT_DES, '', 'cbc', '');
mcrypt_generic_init($td, $k, $k);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
$data = base64_encode($data);
return $data;
} function decrypt($input)
{
$crypt = base64_decode($input);
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
$size = 16;
$k = C('KEY_LONG'); $data = openssl_decrypt($crypt, 'AES-128-CBC', $k, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $k);
} else {
$size = 8;
$k = C('KEY_SHORT'); $td = mcrypt_module_open(MCRYPT_DES, '', 'cbc', '');
mcrypt_generic_init($td, $k, $k);
$data = mdecrypt_generic($td, $crypt);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
$data = pkcs5_unpad($data);
$data = rtrim($data);
return $data;
}
function pkcs5_pad($string, $blocksize = 16)
{
$len = strlen($string); $pad = $blocksize - ($len % $blocksize); $string .= str_repeat(chr($pad), $pad); return $string;
} function pkcs5_unpad($string)
{
$slast = ord(substr($string, -1)); $slastc = chr($slast); $pcheck = substr($string, -$slast); if (preg_match("/$slastc{" . $slast . "}/", $string)) { $string = substr($string, 0, strlen($string) - $slast); return $string; } else { return false; }
} function hexToStr($hex)
{ $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string;
}

php7之前的版本

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);
} }

最新文章

  1. Logstash安装及部署
  2. EventBus的一个bug??
  3. 关于 MySQL 的 boolean 和 tinyint(1)
  4. 参数嗅探(Parameter Sniffing)(1/2)
  5. XSS攻击:获取浏览器记住的明文密码
  6. spring利用注解来注册bean到容器
  7. 车牌识别LPR(一)-- 研究背景
  8. java6内置JS引擎初接触
  9. 红豆带你从零学C#系列之:开始C#编程(二)
  10. Java EE (10) - 资源服务器的整合
  11. UIView 和 CALayer 的区别和联系
  12. 2、hibernate七步走完成增删改查
  13. spring mvc:属性无法自动注入
  14. JavaScript的简单入门
  15. Cocos2D两个方法的重构一例
  16. 怎样使用projectproperty sheet(.vsprops)来管理工程
  17. 【学习笔记】tensorflow基础
  18. P1962 斐波那契数列
  19. Android OkHttp Get请求方式
  20. mysql根据出生日期查询年龄

热门文章

  1. ISC BIND9 - 最详细、最认真的从零开始的BIND 9 服务讲解
  2. 小心你的个人信息——GitHub 热点速览 v.21.09
  3. jquery动态赋值id与动态取id方法
  4. 一文帮你搞懂 Android 文件描述符
  5. jQuery实现全网热播视频
  6. PAT-1086(Tree Traversals Again)Java语言实现+根据中序和前序遍历构建树并且给出后序遍历序列
  7. C++图论算法——图的储存方式
  8. MongoDB4.2 分片扫盲说明
  9. java例题_02 101~200以内的素数
  10. markdown的基础语法