如何在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 相关文章推荐
Thinkphp的volist标签嵌套循环使用教程
Jul 08 PHP
PHP实现利用MySQL保存session的方法
Aug 23 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
PHP实现根据图片色界在不同位置加水印的方法
Aug 08 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
php使用变量动态创建类的对象用法示例
Feb 06 PHP
php实现微信支付之退款功能
May 30 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 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/07/24 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
jquery的live使用注意事项
2014/02/18 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
详解Puppeteer 入门教程
2018/05/09 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
vue实现手机端省市区区域选择
2019/09/27 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
python函数局部变量用法实例分析
2015/08/04 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
Python中装饰器学习总结
2018/02/10 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Python地图绘制实操详解
2019/03/04 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
使用AJAX和Django获取数据的方法实例
2020/10/25 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
应聘收银员个人的求职信
2013/11/30 职场文书
计算机学生求职信范文
2014/01/30 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
励志演讲稿范文
2014/04/29 职场文书
论文致谢词范文
2015/05/14 职场文书
导师鉴定意见
2015/06/05 职场文书
电工实训心得体会
2016/01/14 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android
Python torch.flatten()函数案例详解
2021/08/30 Python
redis复制有可能碰到的问题汇总
2022/04/03 Redis
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python