如何在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 相关文章推荐
PHP中的加密功能
Oct 09 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
PHP动态分页函数,PHP开发分页必备啦
Nov 07 PHP
win7下memCache的安装过程(具体操作步骤)
Jun 28 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
php实现异步数据调用的方法
Dec 24 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
php中序列化与反序列化详解
Feb 13 PHP
php支付宝APP支付功能
Jul 29 PHP
php无限极分类实现方法分析
Jul 04 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
thinkphp连贯操作实例分析
2014/11/22 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
vue组件的写法汇总
2018/04/12 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
python 双循环遍历list 变量判断代码
2020/05/04 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
捐资助学倡议书
2014/04/15 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
2014年残联工作总结
2014/11/21 职场文书
三潭印月的导游词
2015/02/12 职场文书
2015年个人思想总结
2015/03/09 职场文书
大队委员竞选稿
2015/11/20 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
公历12个月名称的由来
2022/04/12 杂记
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技