如何在PHP中使用AES加密算法加密数据


Posted in PHP onJune 24, 2020

在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言)。这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原。

除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解。

在PHP中,我们必须先安装好mcrypt这个模块,并且添加相应版本的扩展到php中,详情可以看 不重新编译PHP安装Mcrypt扩展

AES加密模式和填充方式有以下之中,但不是全部

算法/模式/填充        16字节加密后数据长度    不满16字节加密后长度
AES/CBC/NoPadding       16             不支持
AES/CBC/PKCS5Padding     32             16
AES/CBC/ISO10126Padding    32             16
AES/CFB/NoPadding       16             原始数据长度
AES/CFB/PKCS5Padding     32             16
AES/CFB/ISO10126Padding    32             16
AES/ECB/NoPadding       16             不支持
AES/ECB/PKCS5Padding     32             16
AES/ECB/ISO10126Padding    32             16
AES/OFB/NoPadding       16             原始数据长度
AES/OFB/PKCS5Padding     32             16
AES/OFB/ISO10126Padding    32             16
AES/PCBC/NoPadding      16             不支持
AES/PCBC/PKCS5Padding     32             16
AES/PCBC/ISO10126Padding   32             16

下面就是在PHP中使用AES对数据加密

AES-CBC 加密方案

<?php
$privateKey = "1234567812345678";
$iv 	= "1234567812345678";
$data 	= "Test String";

//加密
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
echo(base64_encode($encrypted));
echo '<br/>';

//解密
$encryptedData = base64_decode("2fbwW9+8vPId2/foafZq6Q==");
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);
echo($decrypted);
?>

AES-ECB加密方案

<?php 
//加密  
$key = '1234567890123456';  
$content = 'hello';  
$padkey = pad2Length($key,16);  
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
$iv_size = mcrypt_enc_get_iv_size($cipher);  
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); #IV自动生成?  
echo '自动生成iv的长度:'.strlen($iv).'位:'.bin2hex($iv).'<br>';  
if (mcrypt_generic_init($cipher, pad2Length($key,16), $iv) != -1)  
{  
  // PHP pads with NULL bytes if $content is not a multiple of the block size..  
  $cipherText = mcrypt_generic($cipher,pad2Length($content,16) );  
  mcrypt_generic_deinit($cipher);  
  mcrypt_module_close($cipher);  
    
  // Display the result in hex.  
  printf("128-bit encrypted result:n%snn",bin2hex($cipherText));  
  print("<br />");  
    
}  
//解密  
$mw = bin2hex($cipherText);  
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
if (mcrypt_generic_init($td, $padkey, $iv) != -1)  
{  
  $p_t = mdecrypt_generic($td, hexToStr($mw));  
  mcrypt_generic_deinit($td);  
  mcrypt_module_close($td);  
    
  $p_t = trimEnd($p_t);  
  echo '解密:';  
  print($p_t);  
  print("<br />");  
  print(bin2hex($p_t));  
  echo '<br><br>';  
}  
//将$text补足$padlen倍数的长度  
function pad2Length($text, $padlen){  
  $len = strlen($text)%$padlen;  
  $res = $text;  
  $span = $padlen-$len;  
  for($i=0; $i<$span; $i++){  
    $res .= chr($span);  
  }  
  return $res;  
}  
//将解密后多余的长度去掉(因为在加密的时候 补充长度满足block_size的长度)  
function trimEnd($text){  
  $len = strlen($text);  
  $c = $text[$len-1];  
  if(ord($c) <$len){  
    for($i=$len-ord($c); $i<$len; $i++){  
      if($text[$i] != $c){  
        return $text;  
      }  
    }  
    return substr($text, 0, $len-ord($c));  
  }  
  return $text;  
}  
//16进制的转为2进制字符串  
function hexToStr($hex)   
{   
  $bin="";   
  for($i=0; $i<strlen($hex)-1; $i+=2)   
  {  
    $bin.=chr(hexdec($hex[$i].$hex[$i+1]));   
  }  
  return $bin;   
}

AES-ECB加密方案

<?php    
$key = '1234567890123456';  
$key = pad2Length($key,16);  
$iv = 'asdff';  
$content = 'hello';  
$content = pad2Length($content,16);  
$AESed = bin2hex( mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$content,MCRYPT_MODE_ECB,$iv) ); #加密  
echo "128-bit encrypted result:".$AESed.'<br>';  
$jiemi = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,hexToStr($AESed),MCRYPT_MODE_ECB,$iv); #解密  
echo '解密:';  
echo trimEnd($jiemi);   
?>

以上只是我列出的简单的3种加密方法,事实上还有很多中方法,需要我们不断的学习。密码学的道路还任重而道远。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
用函数读出数据表内容放入二维数组
Oct 09 PHP
PHP ajax 分页类代码
Nov 13 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
web目录下不应该存在多余的程序(安全考虑)
May 09 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
PHP的PDO操作简单示例
Mar 30 PHP
PHP性能优化大全(php.ini)
May 20 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
php实现的表单验证类完整示例
Aug 13 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
Jun 24 #PHP
解决PhpStorm64不能启动的问题
Jun 20 #PHP
php实现断点续传大文件示例代码
Jun 19 #PHP
PHP基于openssl实现非对称加密代码实例
Jun 19 #PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 #PHP
基于PHP实现堆排序原理及实例详解
Jun 19 #PHP
深入分析PHP设计模式
Jun 15 #PHP
You might like
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
Python pass详细介绍及实例代码
2016/11/24 Python
Python3.6正式版新特性预览
2016/12/15 Python
Python subprocess模块详细解读
2018/01/29 Python
python语音识别实践之百度语音API
2018/08/30 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Python 读写文件的操作代码
2018/09/20 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
pandas ix &amp;iloc &amp;loc的区别
2019/01/10 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
个人思想理论学习的自我鉴定
2013/11/30 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
建房协议书
2014/04/11 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
新课程改革心得体会
2016/01/22 职场文书
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL