如何在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获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
Views rows style模板重写代码
May 16 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
php使用百度天气接口示例
Apr 22 PHP
PHP防范SQL注入的具体方法详解(测试通过)
May 09 PHP
php获取一个变量的名字的方法
Sep 05 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
php中文验证码实现方法
Jun 18 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
Oct 25 PHP
Yii使用DbTarget实现日志功能的示例代码
Jul 21 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
paypal即时到账php实现代码
2010/11/28 PHP
PHP编程函数安全篇
2013/01/08 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
Mvc提交表单的四种方法全程详解
2016/08/10 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
Js判断H5上下滑动方向及滑动到顶部和底部判断的示例代码
2017/11/15 Javascript
详解vue添加删除元素的方法
2018/06/30 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
python列表与元组详解实例
2013/11/01 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
努比亚手机官网:nubia
2016/10/06 全球购物
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
六查六看剖析材料
2014/02/15 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
高中政治教学反思
2016/02/23 职场文书
2019各种保证书范文
2019/06/24 职场文书