直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中。

php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.

  1. class Aes {
  2.  
  3. private $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in to HEX and placed it here
  4.  
  5. private $key = '397e2eb61307109f6e68006ebcb62f98'; #Same as in JAVA
  6.  
  7. function __construct($key) {
  8. $this->key = $key;
  9. $this->key = hash('sha256', $this->key, true);
  10. }
  11.  
  12. /*
  13. function encrypt($str) {
  14. $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
  15. mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
  16. $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  17. $pad = $block - (strlen($str) % $block);
  18. $str .= str_repeat(chr($pad), $pad);
  19. $encrypted = mcrypt_generic($td, $str);
  20. mcrypt_generic_deinit($td);
  21. mcrypt_module_close($td);
  22. return base64_encode($encrypted);
  23. }
  24. function decrypt($code) {
  25. $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
  26. mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));
  27. $str = mdecrypt_generic($td, base64_decode($code));
  28. $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  29. mcrypt_generic_deinit($td);
  30. mcrypt_module_close($td);
  31. return $this->strippadding($str);
  32. }*/
  33.  
  34. public function encrypt($input)
  35. {
  36. $data = openssl_encrypt($input, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
  37. $data = base64_encode($data);
  38. return $data;
  39. }
  40.  
  41. public function decrypt($input)
  42. {
  43. $decrypted = openssl_decrypt(base64_decode($input), 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->hexToStr($this->hex_iv));
  44. return $decrypted;
  45. }
  46.  
  47. /*
  48. For PKCS7 padding
  49. */
  50.  
  51. private function addpadding($string, $blocksize = 16) {
  52.  
  53. $len = strlen($string);
  54.  
  55. $pad = $blocksize - ($len % $blocksize);
  56.  
  57. $string .= str_repeat(chr($pad), $pad);
  58.  
  59. return $string;
  60.  
  61. }
  62.  
  63. private function strippadding($string) {
  64.  
  65. $slast = ord(substr($string, -1));
  66.  
  67. $slastc = chr($slast);
  68.  
  69. $pcheck = substr($string, -$slast);
  70.  
  71. if (preg_match("/$slastc{" . $slast . "}/", $string)) {
  72.  
  73. $string = substr($string, 0, strlen($string) - $slast);
  74.  
  75. return $string;
  76.  
  77. } else {
  78.  
  79. return false;
  80.  
  81. }
  82.  
  83. }
  84.  
  85. function hexToStr($hex)
  86. {
  87.  
  88. $string='';
  89.  
  90. for ($i=0; $i < strlen($hex)-1; $i+=2)
  91.  
  92. {
  93.  
  94. $string .= chr(hexdec($hex[$i].$hex[$i+1]));
  95.  
  96. }
  97.  
  98. return $string;
  99. }
  100.  
  101. }

  1. /**
  2. * @param array $data
  3. * 生成每次请求的sign 加密信息
  4. * @return string
  5. * Author: yehui
  6. * Date: 2019/11/19 23:33
  7. */
  8. public static function setSign($data = []){
  9. // 1 按字段排序
  10. ksort($data);
  11. // 2 拼接字符串数据 &
  12.  
  13. //$data = array('foo'=>'bar', 
  14. //              'baz'=>'boom',  
  15. //              'php'=>'hypertext processor'); 
  16. //echo http_build_query($data); 
  17. ///* 输出: 
  18. //       foo=bar&baz=boom&php=hypertext+processor 
  19. //*/ 
  20.  
  21. $string = http_build_query($data); //http_build_query — 生成 URL-encode 之后的请求字符串
  22. // 3 通过aes加密
  23. $aes = new Aes(config('app.aeskey'));
  24. $string = $aes->encrypt($string);
  25. // 4 最终返回加密的数据
  26. return $string;
  27. }
  1.  
  1. public function testAes(){
    $data = [
    'name'=>'yh',
    'age'=>12,
    ];
    $str = '05rIEfJkLlXQpjuUgxFgMw=='; //加密后的数据
    //echo IAuth::setSign($data);//05rIEfJkLlXQpjuUgxFgMw== 加密后的数据
    $aes = new Aes(config('app.aeskey'));
    echo $aes->decrypt('05rIEfJkLlXQpjuUgxFgMw==');//age=12&name=yh 解密后的数据
    }
  1.  

PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated的更多相关文章

  1. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  2. C#开发中常用加密解密方法解析

    一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单的说就是单向的加密,即是说无法根据密文推 ...

  3. NET中各种加密解密方法

    /// <summary> /// AES对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB),这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位, ...

  4. ios常见加密解密方法

    在其他平台中经常会计算MD5值,在iOS平台中也提供了该方法,首先需要导入头文件 #import <CommonCrypto/CommonDigest.h> 方法CC_MD5可以获取MD5 ...

  5. C# 实现 JAVA AES加密解密[原创]

    以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...

  6. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

  7. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

  8. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  9. JAVA中使用AES加密解密

    技术交流群: 233513714 /** * AES加密测试 * * @param str 加密参数 */ public void aesTest(String str) { log.info(&qu ...

随机推荐

  1. Win10不能远程其他远程计算机的解决办法

    Win10不能远程其他远程计算机的解决办法   转自: https://blog.csdn.net/qq_38197830/article/details/69488236 首先打开控制面板——> ...

  2. Hadoop运行模式:本地模式、伪分布模式、完全分布模式

    1.本地模式:默认模式 - 不对配置文件进行修改. - 使用本地文件系统,而不是分布式文件系统. - Hadoop不会启动NameNode.DataNode.ResourceManager.NodeM ...

  3. hive DDL操作

    1.创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path ...

  4. 阿里大佬教你,如何写好 Java 代码!

    点击上方蓝色链接,关注并"设为星标" Java干货,每天及时推送 阿里大佬分享的一篇很不错的文章,推荐收藏! 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生 ...

  5. BZOJ 1085(IDA*)

    题面 传送门 分析 首先,直接搜索肯定会TLE 很容易想到用迭代加深的方法,限定搜索深度 但是,这样仍然不够,需要用启发式的方法优化 我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x) ...

  6. 广告URL

    讨厌的csdn 广告,百度搜索了一次,csdn cookie广告追了你好几年还有... 把下面的url 重定向127.0.0.1  ,只记录了百度广告,部分阿里的广告,其他还未记录 虽然也用Adblo ...

  7. Ribbon远程调用

    Ribbon是客户端的负载均衡机制,它有几种负载均衡机制.默认是轮询,我们也可以自定义规则.通过合理的分配网络请求来减小服务器的压力.项目都是注册到eureka服务器上.通过ribbon去调用其他服务 ...

  8. JavaScript 模块化简析

    关于模块化,最直接的表现就是我们写的 require 和 import 关键字,如果查阅相关资料,就一定会遇到 CommonJS .CMD AMD 这些名词,以及 RequireJS.SeaJS 等陌 ...

  9. k3 cloud支付申请单下推付款单时候提示未将对象引用设置到对象的实例

    项目支付申请部门没有币别没有填写,没有把币别带过来才

  10. js string相关方法

    1>concat()      //合并返回新的字符串 var a="么么么么",b="ssss"; a.concat(b) //"么么么么ss ...