如何在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设计模式 注册表模式(多个类的注册)
Feb 05 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
php简单防盗链实现方法
Jul 29 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 09 PHP
Git命令之分支详解
Mar 02 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学习笔记之二 php入门知识
2011/01/12 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
Angular排序实例详解
2017/06/28 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
最新的互联网创业计划书
2014/01/10 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
迎新生标语大全
2014/10/06 职场文书
假释思想汇报范文
2014/10/11 职场文书
孔子观后感
2015/06/08 职场文书
雷锋观后感
2015/06/10 职场文书
行为习惯主题班会
2015/08/14 职场文书
nginx优化的六点方法
2021/03/31 Servers
详解用Python把PDF转为Word方法总结
2021/04/27 Python