如何在PHP中使用AES加密算法加密数据

在研究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种加密方法,事实上还有很多中方法,需要我们不断的学习。密码学的道路还任重而道远。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • PHP的AES加密算法完整实例

    本文实例讲述了PHP的AES加密算法.分享给大家供大家参考,具体如下: <?php class MCrypt { private $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in to HEX and placed it here private $key = 'U1MjU1M0FDOUZ.Qz'; #Same as in JAVA function __construct() { $this-

  • PHP对称加密算法(DES/AES)类的实现代码

    对称密钥加密机制即对称密码体系,也称为单钥密码体系和传统密码体系.对称密码体系通常分为两大类,一类是分组密码(如DES.AES算法),另一类是序列密码(如RC4算法). AES 是一个新的可以用于保护电子数据的加密算法.明确地说,AES 是一个迭代的.对称密钥分组的密码,它可以使用128.192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据.通过分组密码返回的加密数据 的位数与输入数据相同.迭代加密

  • PHP实现AES256加密算法实例

    本文实例讲述了PHP实现AES256加密算法的方法,是较为常见的一种加密算法.分享给大家供大家参考.具体如下: aes.class.php文件如下: <?php /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* AES implementation in PHP (c) Chris Veness 2005-2011. Right of fre

  • JS实现AES加密并与PHP互通的方法分析

    本文实例讲述了JS实现AES加密并与PHP互通的方法.分享给大家供大家参考,具体如下: 有关数据加密解密问题,有很多钟加密方式: 这里我讲述下js和php实现AES互通 js加密: 首先引入这几个js文件 本站下载地址. <script type="text/JavaScript" src="/CryptoJS/aes.js"></script> <script type="text/javascript" src=

  • PHP实现的简单AES加密解密算法实例

    本文实例讲述了PHP简单AES加密解密算法.分享给大家供大家参考,具体如下: /* * 实现AES加密 * $str : 要加密的字符串 * $keys : 加密密钥 * $iv : 加密向量 * $cipher_alg : 加密方式 */ function ecryptdString($str,$keys="6461772803150152",$iv="8105547186756005",$cipher_alg=MCRYPT_RIJNDAEL_128){ $enc

  • PHP aes (ecb)解密后乱码问题

    内容:abcd KEY:1234567890123456 加密后base64:T7UT2NQ1AFvR9unjA0wKWA== function apiDataDecrypt($data, $key='') { $data = base64_decode($data); $pad = 16 - (strlen($data) % 16); $padData = $data . str_repeat(chr($pad), $pad); return mcrypt_decrypt(MCRYPT_RIJ

  • PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案

    前言 mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中. PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt. 示例代码 /** * [AesSecurity aes加密,支持PHP7.1] */ class AesSecurity { /** * [encrypt aes加密] * @param [type] $input [要加密的数据] * @par

  • php中AES加密解密的例子小结

    aesDemo.php: 例子, 复制代码 代码如下: <?phprequire_once('./AES.php');//$aes = new AES();$aes = new AES(true);// 把加密后的字符串按十六进制进行存储//$aes = new AES(true,true);// 带有调试信息且加密字符串按十六进制存储$key = "this is a 32 byte key";// 密钥$keys = $aes->makeKey($key);$encod

  • 如何在PHP中使用AES加密算法加密数据

    在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言).这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原. 除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解. 在PHP中,我们必须先安装好mcrypt这个模块,并且添加相应版本的扩展到php中,详情可以看 不重新编译PHP安装Mcrypt扩展 AES加密模式和填充方式有以下之中,但不是全部 算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度 AE

  • 如何在java中使用Jython

    目录 一.Jython是什么 二.使用步骤 1.引入依赖 2.调用代码 2.python脚本 三.问题 1.报错:ImportError:Nomodulenamedpasslib 2.报错:CannotcreatePyStringwithnon-bytevalue 前言: 由于项目中需要用到Java调用Python的脚本,来实现一些功能,就对jython做了一些了解,通过jython可以实现java对python脚本的调用. 一.Jython是什么 Jython 是 Python 的纯 Java

  • 盘点Python 爬虫中的常见加密算法

    目录 前言 1. 基础常识 2. Base64伪加密 3. MD5加密 4. AES/DES对称加密 1.密钥 2.填充 3.模式 前言 今天小编就带着大家来盘点一下数据抓取过程中这些主流的加密算法,它们有什么特征.加密的方式有哪些等等,知道了这些之后对于我们逆向破解这些加密的参数会起到不少的帮助! 相信大家在数据抓取的时候,会碰到很多加密的参数,例如像是"token"."sign"等等,今天小编就带着大家来盘点一下数据抓取过程中这些主流的加密算法,它们有什么特征.

  • 详解如何在Java中加密和解密zip文件

    目录 依赖 压缩一个文件 压缩多个文件 压缩一个目录 创建一个分割的压缩文件 提取所有文件 提取单个文件 总结 依赖 让我们先把 zip4j 依赖关系添加到我们的 pom.xml 文件中. <dependency>     <groupId>net.lingala.zip4j</groupId>     <artifactId>zip4j</artifactId>     <version>2.9.0</version>

  • 如何在AngularJs中调用第三方插件库

    在AngularJs中我们会不可避免的使用第三方库,例如jquery插件库.我们不能散乱的在AngularJS中引入这些库,例如在controller中.那么应该怎么在Angular中使用第三方库呢? 如何使用? 很简单,给插件写一个directive. 在这里,我会使用一个简单的jquery插件Toolbar.js 的DEMO. 这是我们如何在jquery中创建一个tooltip的: <!-- Click this to see a toolbar --> <div id="

  • OAuth认证协议中的HMACSHA1加密算法(实例)

    实例如下: <?php function hmacsha1($key,$data) { $blocksize=64; $hashfunc='sha1'; if (strlen($key)>$blocksize) $key=pack('H*', $hashfunc($key)); $key=str_pad($key,$blocksize,chr(0x00)); $ipad=str_repeat(chr(0x36),$blocksize); $opad=str_repeat(chr(0x5c),$

  • 分享如何在VB中调用VC编写的DLL

    一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL:一种是VC生成ActiveX控件(.ocx),在VB中插入:还有一种是在VC中生成ActiveX Automation服务器,在VB中调用.相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法. 先说说VC++的编程.首先在VC++中生成Win32 DLL工程.在这个工程中添加几个函数供VB用户调用.一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一

  • 实例学习如何在ASP中调用DLL

    本文通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程,向大家介绍如何在ASP中调用DLL的文章专题. 动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤.  首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程.  在VB5.0的环境下,新建一个工程,并双击新建工

  • 如何在ADSI中查询用户属性?

    如何在ADSI中查询用户属性?<%Dim x On error resume next'Set x = GetObject("WinNT://kenfilszwin2k/allen")strLDAP="LDAP://kenfilszwin2k/CN=Allen He,OU=kenfilsz,dc=kenfilsz,dc=com" set x=getobject(strLDAP)Response.Write "Object Name: " &

随机推荐