如何在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框架Phpbean说明
Jan 10 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
php建立Ftp连接的方法
Mar 07 PHP
php中get_defined_constants函数用法实例分析
May 12 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
微信公众平台DEMO(PHP)
May 04 PHP
php微信开发之百度天气预报
Nov 18 PHP
Zend Framework校验器Zend_Validate用法详解
Dec 09 PHP
php递归函数怎么用才有效
Feb 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动态生成函数示例
2014/03/21 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
python pygame实现球球大作战
2019/11/25 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
德国团购网站:Groupon德国
2018/03/13 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
八年级美术教学反思
2014/02/02 职场文书
安全施工标语
2014/06/07 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
大学校园招聘会感想
2015/08/10 职场文书
python某漫画app逆向
2021/03/31 Python