AES(Advanced Encryption Standard,高级加密标准)是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。Rijndael是在AES中使用的基本密码算法。

对于此算法网上流传有很多php代码实现的版本,其实php的扩展mcrypt完全支持此加密算法,不必要自己去写代码实现。先不说自己写费时费力(当然你若是想研究此加密算法,那另说),使用php代码实现的算法效率也不会太高。

mcrypt扩展在php中默认是没有的,需要自己安装配置,其方法可以在网上搜索,这里不在详述。你可以使用以下代码检查你的php环境是否支持mcrypt

  1. $cipher_list = mcrypt_list_algorithms();//mcrypt支持的加密算法列表
  2. $mode_list = mcrypt_list_modes();   //mcrypt支持的加密模式列表
  3. echo '<xmp>';
  4. print_r($cipher_list);
  5. print_r($mode_list);

若你的环境支持mcrypt,输出结果应该如下:

  1. Array
  2. (
  3. [0] => cast-128
  4. [1] => gost
  5. [2] => rijndael-128
  6. [3] => twofish
  7. [4] => arcfour
  8. [5] => cast-256
  9. [6] => loki97
  10. [7] => rijndael-192
  11. [8] => saferplus
  12. [9] => wake
  13. [10] => blowfish-compat
  14. [11] => des
  15. [12] => rijndael-256
  16. [13] => serpent
  17. [14] => xtea
  18. [15] => blowfish
  19. [16] => enigma
  20. [17] => rc2
  21. [18] => tripledes
  22. )
  23. Array
  24. (
  25. [0] => cbc
  26. [1] => cfb
  27. [2] => ctr
  28. [3] => ecb
  29. [4] => ncfb
  30. [5] => nofb
  31. [6] => ofb
  32. [7] => stream
  33. )

其中rijndael-128,rijndael-192,rijndael-256就是AES加密,3种分别是使用不同的数据块和密钥长度进行加密。

以下是使用扩展mcrypt实现AES加密的简单示例

  1. /**
  2. * 利用mcrypt做AES加密解密
  3. * @author ts24<tsxw24@gmail.com>
  4. */
  5. abstract class AES{
  6. /**
  7. * 算法,另外还有192和256两种长度
  8. */
  9. const CIPHER = MCRYPT_RIJNDAEL_128;
  10. /**
  11. * 模式
  12. */
  13. const MODE = MCRYPT_MODE_ECB;
  14. /**
  15. * 加密
  16. * @param string $key   密钥
  17. * @param string $str   需加密的字符串
  18. * @return type
  19. */
  20. static public function encode( $key, $str ){
  21. $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
  22. return mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);
  23. }
  24. /**
  25. * 解密
  26. * @param type $key
  27. * @param type $str
  28. * @return type
  29. */
  30. static public function decode( $key, $str ){
  31. $iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
  32. return mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv);
  33. }
  34. }

使用示例:

  1. $str = '我是明文我是明文我是明文我是明文我是明文dsfdghgasdfasdddddddd';
  2. $key = 'aSGJLGYEWERWRREW4567i8o';
  3. $str1=AES::encode($key, $str);
  4. $str2=AES::decode($key, $str1);
  5. echo '<xmp>';
  6. var_dump($str);
  7. var_dump($str1);
  8. var_dump($str2);
  9. var_dump(rtrim($str2));

输出结果

问题,不知道是什么原因,解密后的字符串(见上图),末尾还留下有不可见的填充字符,当明文刚好可以分组时则没有。

使用php扩展mcrypt实现AES加密的更多相关文章

  1. PHP 使用AES加密,并扩展失效时间检测

    /** * 具有时间校验的AES加密 * @param string $string 要处理的字符串 * @param int $timeout 超时时间,单位秒 * @param string $t ...

  2. PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated

    直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...

  3. javascript AES加密 C#AES解密实现

    首先需要引入js类库 crypto-js(开源),地址:http://code.google.com/p/crypto-js 现在很多人无法打开这个地址不要紧,下面我们会将全部代码贴出来 需要引入 a ...

  4. 信息安全-加密:AES 加密

    ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...

  5. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  6. PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】

    一:Mcrypt简介 Mcrypt是PHP的一个扩展,完成了常用加密算法的封装.其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Bl ...

  7. JAVA的对称加密算法AES——加密和解密

    出自: http://blog.csdn.net/hongtashan11/article/details/6599645 http://www.cnblogs.com/liunanjava/p/42 ...

  8. [PHP]AES加密----PHP服务端和Android客户端

    本文采取128位AES-CBC模式加密和解密 1.首先对服务端安装mcrypt: sudo apt-get install php5-mcrypt php5-dev sudo php5enmod mc ...

  9. AES加密原理和AOE工程实践

    在AI业务的开发的过程中,我们常常需要对模型文件进行加密.我们从以下几个方面来说一说AES的加密原理以及AOE里的工程实践. 常见的加密算法 AOE对模型加密需求的思考 AES的加密原理 AOE工程实 ...

随机推荐

  1. Caffe框架详细梳理

    protobuf是google公司开发的,并在Google内部久经考验的一个东西,在08年google把它贡献给了开源社区,随后便有越来越多的人使用它.protobuf是一个结构化信息传递的工具,主要 ...

  2. 解析C#彩色图像灰度化算法的实现代码详解

    http://www.jb51.net/article/37067.htm public static Bitmap MakeGrayscale(Bitmap original)        {   ...

  3. php7实现基于openssl的加密解密方法

    还需要注意的是加密字符串长度问题,如果加密字符串长度太长需要进行分段加解密,如下代码: 加密:(公匙加密,私密一般用来解密) function encrypt($originalData){ $pub ...

  4. valgrind检查C/C++内存泄漏

    valgrind --tool=memcheck --leak-check=full ./httptest  valgrind --tool=memcheck --leak-check=full -- ...

  5. 题解 P1345 【[USACO5.4]奶牛的电信Telecowmunication】

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  6. tap事件的原理详解

    点击事件延迟问题所在: 在移动端中,由于两次触摸是放大操作,,所以当你点击一次的时候,浏览器会等待300ms,看用户是否会进行第二次点击,如果没有的话,才会执行点击事件 为什么要解决: 随着h5游戏, ...

  7. CF758 D. Ability To Convert 细节处理字符串

    link 题意:给定进制数n及一串数字,问在此进制下这串数能看成最小的数(10进制)是多少(如HEX下 1|13|11 = 475) 思路:此题要仔细思考细节.首先要想使数最小那么必定有个想法是使低位 ...

  8. Codeforces Round #191 (Div. 2) A. Flipping Game(简单)

    A. Flipping Game time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  9. 重构改善既有代码设计--重构手法15:Remove Middle Man (移除中间人)

    某个类做了过多的简单委托动作.让客户直接调用受托类. 动机:在Hide Delegate (隐藏委托关系)的“动机”中,谈到了“封装委托对象”的好处.但是这层封装也是要付出代价的,它的代价是:每当客户 ...

  10. 说一说ASP.NET web.config 加密及解密方法 (代码)

    /// <summary> /// 保护web.config的加密和解密 /// </summary> public class ProtectHelper { /// < ...