**PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等**

由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式交互调取早期系统数据,由于早期AES使用的是mcrypt_encrypt函数,但该函数在PHP新版本中已逐渐废弃,PHP新版本中使用openssl_encrypt取代mcrypt_encrypt。

于是重新基于PHP7编写一个新类,由于需兼容现有早期系统的AES加解密类(并存填充与无填充),所以该类中增添部分判断。在规划项目、技术及开发时,未来往事推荐你尽可能规范化、标准化、统一化,以尽可能规避持续的维护投入,提升有效开发时间。

**AES对等加密解密类文件:CBC模式 - PHP**

```php

* | @Create Time: 2019/07/08 08:56

*/

namespace Helper;

//加解密类

class AesCrypt

{

protected $cipher = 'AES-128-CBC';

protected $key = '';

protected $iv = '';

protected $option = OPENSSL_ZERO_PADDING;

function __construct($key, $iv){

$this->key = substr(md5($key), 16, 32);

$this->iv = substr(md5($iv), 16, 32);

}

/**

* 对明文进行加密

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

* @return string 加密后的密文

*/

public function encrypt($text)

{

$text = json_encode($text);

try {

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

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

$text = $random . $text;

$pkc_encoder =new PKCS7Encoder();

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

$encrypt_data = openssl_encrypt($text, $this->cipher, $this->key, $this->option, $this->iv);

return [StatusCode::$OK, $encrypt_data];

}catch (\Exception $e) {

return [StatusCode::$EncryptAESError, null];

}

}

/**

* 对密文进行解密

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

* @return string 解密得到的明文

*/

public function decrypt($encrypted)

{

try {

$decrypted = openssl_decrypt($encrypted, $this->cipher, $this->key, $this->option, $this->iv);

}catch (\Exception $e) {

return [StatusCode::$DecryptAESError, null];

}

try {

//去除补位字符

$pkc_encoder =new PKCS7Encoder();

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

//去除16位随机字符串

if (strlen($result) < 16){

return [StatusCode::$DecryptAESPKCSError, null];

}

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

$decrypt_data = json_decode($content, true);

}catch (\Exception $e) {

return [StatusCode::$DecryptAESPKCSError, null];

}

return [StatusCode::$OK, $decrypt_data];

}

/**

* 获得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;

}

}

//状态码

class StatusCode

{

public static $OK = 0;

public static $EncryptAESError = 9001; //加密失败

public static $DecryptAESError = 9002; //解密失败

public static $DecryptAESPKCSError = 9003; //移除填充补位失败

}

//AES加密解密填充补位类

class PKCS7Encoder

{

public static $block_size = 32;

/**

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

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

* @return 补齐明文字符串

*/

function encode($text)

{

$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 > PKCS7Encoder::$block_size) {

$pad = 0;

}

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

}

}

/**

* 调用示例:ios/android/java加密值url传递时建议使用urlencode进行处理

* $key = 'www.fity.cn'; //自行定义 加解密方法会处理截取md5后的16位

* $iv = 'fitycn'; //自行定义

* $aesCrypt = new \Helper\AesCrypt($key, $iv);

*

* #加密

* $data = ['id'=>'1', 'srt'=>'欢迎来访未来往事博客https://www.fity.cn', time=>time()];

* $result = $aesCrypt->encrypt($data); //$data string/array

* #解密:返回值为string/array

* if($result[0] == 0){ //加密字符串存在则进行解密

* $res = $aesCrypt->decrypt($result[1]);

* }

*

* 注意:IOS、Android在加密时请使用PKCS7Padding模式填充数据补位。

**/

```

最后更新于 2020-08-22 22:13:02 并被添加「aes 对等加密 对等解密」标签,已有 3886 位童鞋阅读过。

本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

相关文章

ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密相关推荐

  1. JAVA实现AES加密

    JAVA实现AES加密 java实现AES加密,直接上代码: import java.security.InvalidKeyException; import java.security.NoSuch ...

  2. .NET对JAVA进行AES加密(SHA1PRNG)及解密方法

    第一步:生成对应JAVA AES加密方法的KEY值 private static byte[] encryptJavaAes(string aesKey)         {             ...

  3. java实现AES加密解密

    public class PartnerSign {private PartnerSign() {}/*** AES加密方法** @param content 明文内容* @param passwor ...

  4. java php aes加密解密_php aes 加密解密可与java对接

    php aes 加密解密可与java对接 博主:liu1693 发表时间:2017-02-23 16:52:27 浏览量:100 class Encrypt{ //加密方法 public static ...

  5. Java使用AES加密解密

    AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...

  6. java aes iv 24位_【JAVA】AES加密 简单实现 AES-128/ECB/PKCS5Padding

    AES加密 AES 是一种可逆加密算法,对用户的敏感信息加密处理. 本文暂不深入AES原理,仅关注JAVA代码实现AES加解密. JAVA代码实现 这是一个在线AES加密网站.从页面上我们可以看到如下 ...

  7. java android aes加密解密_AES加密解密在JAVA和ANDROID下互通

    昨天外包安卓的那个人说AES的加解密结果不一样.于是百度搜索发现还真是! 贴上AES加密核心: Cipher cipher = Cipher.getInstance("AES/CBC/PKC ...

  8. java aes加密 base64_【java】AES加密解密|及Base64的使用

    AES加解密算法,使用Base64做转码以及辅助加密: package com.wintv.common; import javax.crypto.Cipher; import javax.crypt ...

  9. 内存中的调用别的软件程序加密解密函数_公司加密软件哪个最好用?

    即使是数据时代的发展,加密技术的不断完善和进步,也没有一家加密软件公司敢说自己的加密软件是最好的.为什么这么说?因为每个企业的环境不同,需要部署的加密环境也不同.所以个人认为"最好用&quo ...

最新文章

  1. tensorflow中name_scope和variable_scope变量的使用
  2. 天下会 - 搜索实战系列之视频
  3. UBUNTU804VirtualBox出现常见问题解决(转高手的)我转的CU的
  4. check generated report by SE16
  5. 彩虹浏览器使用技巧:页签自动切换
  6. opencv图像处理时使用stringstream批量读取图片,处理后并保存
  7. Base64编码解码
  8. xcode 中不小心删除 stroryboard 的恢复办法
  9. 【.Net Framework 体积大?】不安装.net framework 也能运行!?原理补充-3
  10. 管理思维的逻辑之案例作业
  11. 【数学建模常用模型】分类专题
  12. 在r中弄方差分析表_R语言 | 方差分析(上)
  13. 测试用例设计思维导图
  14. 计算机毕业设计ssm火车站售票管理系统
  15. Wake On Lan(WOL)失败的原因
  16. 高校学生档案管理系统(Angularjs+HTML+CSS+bootstrap)
  17. docker之网络管理
  18. 探讨Python在开发中的重要性!
  19. 人生苦短我学python表情包_人生苦短,我学PYTHON
  20. Jquery WeUI(一)

热门文章

  1. 从tensorflow的summary中提取数据,并进行平滑操作与显示
  2. PyTorch 中如何指定GPU
  3. 10.leetcode83-Remove Diplicates from Sorted List
  4. adx-desc-adtype统计
  5. n的m划分 整数拆分问题
  6. 我觉得我应该养成经常翻收藏夹的习惯
  7. ubuntu下的vim与ctags
  8. DevExpress XtraTreeList的复选框 禁用
  9. 解决php保存文件时文件名乱码问题
  10. 扒一扒开源世界有哪些licenses?