如何在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截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
PHP输出时间差函数代码
Jan 28 PHP
深入解析php之sphinx
May 15 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
php 二维数组快速排序算法的实现代码
Oct 17 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 stream_context_create()作用和用法分析
2011/03/29 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
基于php编程规范(详解)
2017/08/17 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
javascript实现拖放效果
2015/12/16 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
Django实现的自定义访问日志模块示例
2017/06/23 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
PyTorch实现AlexNet示例
2020/01/14 Python
什么是python的函数体
2020/06/19 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
高分子材料与工程专业个人求职信
2013/12/15 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
小学生学习保证书
2015/02/26 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
小人国观后感
2015/06/11 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库