封装加密解密类

<?php
namespace app\api\controller;use think\Controller;
header("Content-Type:text/html; charset=utf-8");class Encrypt extends Controller{var $key='0123456789012345678901234567890123456789012345678';// var $key='4G56769180316EF4TGBNDUH8DHGIHKFYD5925RT8BA06YHNK';var $iv='0102030405060708'; //偏移量/*** 对字符串进行3DES加密* @param string 要加密的字符串* @return mixed 加密成功返回加密后的字符串,否则返回false*/public function encrypt3DES($str){$key = pack('H48',$this->key);//结果为24位$iv = pack('H16',$this->iv);//结果为8位$td = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');if ($td === false) {return false;}//检查加密key,iv的长度是否符合算法要求$key = $this->fixLen($key, mcrypt_enc_get_key_size($td));if ( empty($iv) ){$iv_t = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//从随机源创建初始向量}else{$iv_t = $iv;}$iv = $this->fixLen($iv_t, mcrypt_enc_get_iv_size($td));//加密数据长度处理,长度必须是 n * 分组大小,否则需要后补数据,根据不同的补码方式,来补不同的数据$str = $this->addPKCS7Padding($str, mcrypt_enc_get_block_size($td));//初始化加密所需的缓冲区if (mcrypt_generic_init($td, $key, $iv) !== 0) {return false;}$result = mcrypt_generic($td, $str);/*** 对加密后的数据进行base64加密处理,在入库时,varchar类型会自动移除字符串末尾的“空格”。* 由于加密后的数据可能是以空格(ASCII 32)结尾, 这种特性会导致数据损坏。* 官方建议请使用 tinyblob/tinytext(或 larger)字段来存储加密数据。*/$result = base64_encode($result);mcrypt_generic_deinit($td);mcrypt_module_close($td);return $result;}/*** 对加密的字符串进行3DES解密* @param string 要解密的字符串* @return mixed 加密成功返回加密后的字符串,否则返回false*/public function decrypt3DES($str){$key = pack('H48',$this->key);//结果为24位$iv = pack('H16',$this->iv);//结果为8位$td = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');if ($td === false) {return false;}//检查加密key,iv的长度是否符合算法要求$key = $this->fixLen($key, mcrypt_enc_get_key_size($td));if ( empty($iv) ){$iv_t = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//从随机源创建初始向量}else{$iv_t = $iv;}$iv = $this->fixLen($iv_t, mcrypt_enc_get_iv_size($td));//初始化加密所需的缓冲区if (mcrypt_generic_init($td, $key, $iv) !== 0) {return false;}$result = mdecrypt_generic($td, base64_decode($str));mcrypt_generic_deinit($td);mcrypt_module_close($td);/*** 通过 mdecrypt_generic() 函数解密之后的数据是加密之前对加密数据长度补"\0"的数据。* 使用 rtrim($str, "\0") 移除字符串末尾的 "\0" 。*/return $this->stripPKSC7Padding($this->strUnPad($result));}/*** 返回适合算法长度的key,iv字符串,末尾使用0补齐* @param string $str key或iv的值* @param int $td_len 符合条件的key或iv长度* @return string 返回处理后的key或iv值*/private function fixLen($str, $td_len){$str_len = strlen($str);if ($str_len > $td_len) {return substr($str, 0, $td_len);} else if($str_len < $td_len) {return str_pad($str, $td_len, '0');}return $str;}/*** 返回适合算法的分组大小的字符串长度,末尾使用\0补齐* @param string $str 要加密的字符串* @param int $td_group_len 符合算法的分组长度* @return string 返回处理后字符串*/private function strPad($str, $td_group_len){$padding_len = $td_group_len - (strlen($str) % $td_group_len);return str_pad($str, strlen($str) + $padding_len, "\0");}/*** 返回解密后移除字符串末尾的 "\0"的数据* @param string $str 解密后的字符串* @return string 返回处理后字符串*/private function strUnPad($str){return rtrim($str, "\0");}/*** 为字符串添加PKCS7 Padding* @param string $str    源字符串*/private function addPKCS7Padding($str, $td_group_len){$pad = $td_group_len - (strlen($str) % $td_group_len);if ($pad <= $td_group_len) {$char = chr($pad);$str .= str_repeat($char, $pad);}return $str;}/*** 去除字符串末尾的PKCS7 Padding* @param string $source    带有padding字符的字符串*/private function stripPKSC7Padding($str){$char = substr($str, -1, 1);$num = ord($char);if($num > 8){//8是此算法的分组大小,可通过mcrypt_enc_get_block_size获取return $str;}$len = strlen($str);for($i = $len - 1; $i >= $len - $num; $i--){if(ord(substr($str, $i, 1)) != $num){return $str;}}$source = substr($str, 0, -$num);return $source;}}

在其他控制器中调用加密方法,进行加密解密

PHP进行3des加密相关推荐

  1. 怎样操作vue.js使用3DES加密

    如何在VUE-CLI手脚架建立的工程中使用3des加密: 1 npm install crypto-js --save-dev 1 import CryptoJS from 'crypto-js' 1 ...

  2. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  3. 3des java ecb_PHP 3DES加密 与JAVA通用 加密模式:ECB

    昨天帮同事解决了一个接口加密的算法,同事是个小姑娘,不懂,所以老大派我协助她,所以我为了不在姑凉面前掉面子~~火速解决它... 甲方是电信,JAVA写的接口,我一听头就大了,大家都知道~~PHP在加密 ...

  4. 探讨.NET Core数据进行3DES加密和解密问题

    前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...

  5. 探讨NET Core数据进行3DES加密或解密弱密钥问题

    [导读]之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解 ...

  6. java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...

    java 中32位秘钥长度的 3des加密方法? java 中 3des加密 默认是24位秘钥的 现在需求是 32位秘钥加密 尝试很多种方法 解决 结果都不正确 // 密钥 private final ...

  7. Des与3Des加密解密

    /// <summary>/// Des和3Des算法/// </summary>public class Des{/// <summary>/// Des加密// ...

  8. java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )

    在某个项目中,需要开发一个与native相对应的web前端app,后台用的是java restful接口,请求数据时需要用的3des加密.如果想要请求接口,则需要javascript的加密与java相 ...

  9. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  10. Java中3DES加密解密示例

    在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar security/US_export_policy. ...

最新文章

  1. 869所高校上榜!2020中国内地大学第三方综合指数排名出炉
  2. oc中在控件上显示图片
  3. MySQL-[Err] 1055 - Expression #1
  4. 介绍ASP.NET控件ID
  5. 解决:Xshell如何修改默认的登录用户,自动跳转到密码界面
  6. groovy 字符串截取最后一个_python数据类型总结——数字和字符串
  7. c++ 提取傅里叶描述子_非谐声子模拟方法(Normal Mode Decomposition)
  8. 压缩感知及应用 源代码_信言动态|学院成功举办2019年机器学习与压缩感知理论及其应用研讨会...
  9. Linux下安装mysql(yum、二进制包、源码包)
  10. 计算机网络自顶向下第七版第二章课后答案,《计算机网络·自顶向下方法》第七版 第二章 课后习题与问题 答案...
  11. 如何在Windows命令行窗口复制和粘贴?
  12. java导出繁体字word_利用简繁体字转换功能实现简体字文档转换为繁体字文档的方法...
  13. 杀了一个程序员祭天换来今天的正常推送:仿知乎APP源码分享
  14. Appinventor使用
  15. 基于tesseract_ocr实现图片中汉字辨识
  16. CAD特性窗口,快捷特性窗口等不显示图形类型问题
  17. java动态代理(AOP)
  18. 工业相机基本参数以及选型参考(二)
  19. 针对腾讯云服务器 外网不能访问的问题
  20. 【开餐馆】 动态规划

热门文章

  1. 区块链的java实现
  2. 国内生产总值(GDP)数据可视化
  3. 【Android -- 开源库】图表绘制 HelloCharts 的基本使用
  4. cadencesxstrace.exe修复工具C++.rar
  5. 小米盒子/电视如何安装影视通APP?
  6. java的初音跳舞游戏_TGS2019:和初音未来一起开心跳舞!体感节奏游戏《初音未来VR》试玩体验...
  7. BMH online judge刷题记——书的复制(二分)
  8. html常用标签(下)
  9. 企业版证书 打包 发布(网站) 流程
  10. vdsm:获取虚拟机详细信息getInfo