以下代码来自微信sdk里面

/**

* Prpcrypt class

*

* 提供接收和推送给公众平台消息的加解密接口.

*/

class Prpcrypt

{

public $key;

function __construct($k)

{

$this->key = base64_decode($k . "=");

}

/**

* 对明文进行加密

* @param string $text 需要加密的明文

* @return string 加密后的密文

*/

public function encrypt($text, $appid)

{

try {

//获得16位随机字符串,填充到明文之前

$random = $this->getRandomStr();//"aaaabbbbccccdddd";

$text = $random . pack("N", strlen($text)) . $text . $appid;

$iv = substr($this->key, 0, 16);

$pkc_encoder = new \PKCS7Encoder;

$text = $pkc_encoder->encode($text);

$encrypted = openssl_encrypt($text, 'AES-256-CBC', substr($this->key, 0, 32), OPENSSL_ZERO_PADDING, $iv);

return array(ErrorCode::$OK, $encrypted);

} catch (Exception $e) {

//print $e;

return array(ErrorCode::$EncryptAESError, null);

}

}

/**

* 对密文进行解密

* @param string $encrypted 需要解密的密文

* @return string 解密得到的明文

*/

public function decrypt($encrypted, $appid)

{

try {

$iv = substr($this->key, 0, 16);

$decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', substr($this->key, 0, 32), OPENSSL_ZERO_PADDING, $iv);

} catch (Exception $e) {

return array(ErrorCode::$DecryptAESError, null);

}

try {

//去除补位字符

$pkc_encoder = new PKCS7Encoder;

$result = $pkc_encoder->decode($decrypted);

//去除16位随机字符串,网络字节序和AppId

if (strlen($result) < 16)

return "";

$content = substr($result, 16, strlen($result));

$len_list = unpack("N", substr($content, 0, 4));

$xml_len = $len_list[1];

$xml_content = substr($content, 4, $xml_len);

$from_appid = substr($content, $xml_len + 4);

if (!$appid)

$appid = $from_appid;

//如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid

} catch (Exception $e) {

//print $e;

return array(ErrorCode::$IllegalBuffer, null);

}

if ($from_appid != $appid) {

return array(ErrorCode::$ValidateAppidError, null);

}

//不注释上边两行,避免传入appid是错误的情况

return array(0, $xml_content, $from_appid);

//增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复

}

/**

* 随机生成16位字符串

* @return string 生成的字符串

*/

function getRandomStr()

{

$str = "";

$str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";

$max = strlen($str_pol) - 1;

for ($i = 0; $i < 16; $i++) {

$str .= $str_pol[mt_rand(0, $max)];

}

return $str;

}

/**

* PKCS7Encoder class

*

* 提供基于PKCS7算法的加解密接口.

*/

class PKCS7Encoder

{

public static $block_size = 32;

/**

* 对需要加密的明文进行填充补位

* @param $text 需要进行填充补位操作的明文

* @return 补齐明文字符串

*/

function encode($text)

{

$block_size = PKCS7Encoder::$block_size;

$text_length = strlen($text);

//计算需要填充的位数

$amount_to_pad = PKCS7Encoder::$block_size - ($text_length % PKCS7Encoder::$block_size);

if ($amount_to_pad == 0) {

$amount_to_pad = PKCS7Encoder::block_size;

}

//获得补位所用的字符

$pad_chr = chr($amount_to_pad);

$tmp = "";

for ($index = 0; $index < $amount_to_pad; $index++) {

$tmp .= $pad_chr;

}

return $text . $tmp;

}

/**

* 对解密后的明文进行补位删除

* @param decrypted 解密后的明文

* @return 删除填充补位后的明文

*/

function decode($text)

{

$pad = ord(substr($text, -1));

if ($pad < 1 || $pad > 32) {

$pad = 0;

}

return substr($text, 0, (strlen($text) - $pad));

}

}

cryptojs php 互通_如何实现PHP7和CryptoJS的AES加密方式互通?相关推荐

  1. cryptojs php 互通_PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】

    本文实例讲述了PHP7实现和CryptoJS的AES加密方式互通.分享给大家供大家参考,具体如下: PHP类: class AES { /** * * @param string $string 需要 ...

  2. cryptojs php 互通_关于PHP7和CryptoJS的AES加密方式互通

    对于PHP7与CryptoJS的AES加密的方式互通代码不能正确执行,我的测试代码为: JS端:let iv = CryptoJS.enc.Utf8.parse('1111111111111111') ...

  3. 0宽字符加密_前端AES加密方式分析,及其python实现

    在前端常见的加密方式中AES很少使用,因为相对于非对称的RSA安全性很低,AES是典型的对称加密,密钥就在前端源码里. 案列网站是http://ewt360.com,一个并不复杂的网站,首先抓个包看看 ...

  4. python怎样打开加密的文件_如何在Python中解密OpenSSL AES加密的文件?

    拉莫斯之舞 我将通过一些更正重新发布您的代码(我不想掩盖您的版本).当您的代码正常工作时,它不会检测到填充周围的一些错误.特别是,如果提供的解密密钥不正确,则填充逻辑可能会做一些奇怪的事情.如果您同意 ...

  5. aes离线解密工具_如何在Python中解密OpenSSL AES加密文件?

    OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面: openssl aes-256-cbc -salt -in filename -out filename.enc Py ...

  6. AES加密_ js与C#互通

    为什么80%的码农都做不了架构师?>>> javascript部分 npm install crypto-js --save 定义文件jm.js const CryptoJS = r ...

  7. cbc cryptojs 前后端_前端CryptoJS AES/DES加解密与后端PHP AES/DES加解密

    本文涉及到的内容有:前端使用CryptoJS对数据进行DES或AES加密解密: 后端使用PHP openssl对数据进行解密和加密. 前端AES加密数据 首先在vue环境下安装crypto-js,cr ...

  8. 迷雾世界无限号服务器,迷雾世界部分服务器互通公告_迷雾世界部分服务器3月31日数据互通详情分析_手心游戏...

    迷雾世界部分服务器3月31日数据互通公告!迷雾世界亲爱的玩家:为了优化游戏体验,更好地提升组队.交互的互动体验,开发组在3.27 - 3.30对所有玩家进行了关于数据互通的调查投票.结果显示,78%的 ...

  9. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  10. AES加密:PHP与Java互通,解密准确

    AES加密:PHP与Java互通 提交表单中含大写字母解密不正确 AES加密:PHP与Java互通 参考网址:https://www.cnblogs.com/libo0125ok/p/7668026. ...

最新文章

  1. 使用VisualStudio2010连接CodePlex进行代码管理
  2. linux 登录 忘记密码,redhat linux忘记登陆密码之解决办法
  3. java常见的异常类型_Java几种常见的异常类型
  4. 老司机带你深入浅出 Collection
  5. 如何用 SpringBoot 实现并发登录人数控制(附代码)
  6. ECS 选款利器!PTS助您快速上云!
  7. 大爱jQuery,10美女模特有用jQuery/CSS3插入(集成点免费下载)
  8. C++ 深复制与浅复制 RVO问题
  9. Code Project - Your First C# Web Service
  10. 【4】搭建Docker私服harbor
  11. 经纬度转换为平面坐标
  12. 论文笔记_S2D.52_CMRNet++_运行记录
  13. mysql cluster集群安装全纪录
  14. 桌面养花-DesktopPlant v2.3.12原创汉化版
  15. cisco2811语音网关+callmanager拨打外线,外线拨入详解配置
  16. 【组合数学】知识点汇总
  17. 【RX解码MIPI输出】XS9922B 4通道模拟复合视频解码芯片 功能对标TP2815
  18. 提取网页内容-Python
  19. LiveZilla 详细 配置 设置 (一) 安装 wamp
  20. JavaScript中的作用域及作用域链

热门文章

  1. 摩托罗拉发布RhoElements HTML5框架
  2. 陈小琼,你真不好等!
  3. 控制标记符分水岭分割算法 此博文包含图片
  4. 【使用技巧】【图像编辑和处理】将GIF图缩放
  5. 速读-NFA的GPU加速器
  6. 【ArcGIS|空间分析|网络分析】6 创建路径分析模型
  7. dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
  8. android 中国市场份额 2015,2015年安卓芯片市场分析:不再一家独大
  9. Nexmark: 如何设计一个流计算基准测试?
  10. 来吧,用设计模式来干掉 if-else 啊~