PHP 3des加解密新旧方法可对接加密

news2024/11/18 5:50:47

一、旧3des加解密方法

<?php
class Encrypt_3DES
{
    //加密秘钥,
    private $_key;
    private $_iv;
    public function __construct($key, $iv)
    {
        $this->_key = $key;
        $this->_iv = $iv;
    }
    /**
     * 对字符串进行3DES加密
     * @param string 要加密的字符串
     * @return mixed 加密成功返回加密后的字符串,否则返回false
     */
    public function encrypt3DES($str)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
        if ($td === false) {
            return false;
        }
        //检查加密key,iv的长度是否符合算法要求
        $key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
        $iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));
        if (mcrypt_generic_init($td, $key, $iv) !== 0) {
            return false;
        }
        $result = mcrypt_generic($td, $str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return base64_encode($result); // 对加密后的结果进行Base64编码
    }
    /**
     * 对加密的字符串进行3DES解密
     * @param string 要解密的字符串
     * @return mixed 解密成功返回解密后的字符串,否则返回false
     */
    public function decrypt3DES($str)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
        if ($td === false) {
            return false;
        }
        //检查加密key,iv的长度是否符合算法要求
        $key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
        $iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));
        if (mcrypt_generic_init($td, $key, $iv) !== 0) {
            return false;
        }
        $str = base64_decode($str); // 对加密字符串进行Base64解码
        $result = mdecrypt_generic($td, $str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $this->strUnPad($result);
    }
    /**
     * 返回适合算法长度的key,iv字符串
     * @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");
    }
}
$key = '1a2bc@';
$iv = '12345678'; // 将iv改为字符串形式
$str = "abcd123";
$encrypt = new Encrypt_3DES($key, $iv);
$jiaData = $encrypt->encrypt3DES($str);
$jieData = $encrypt->decrypt3DES($jiaData);
echo "未加密字符串:".$str;
echo "\n";
echo "加密字符串:".$jiaData;
echo "\n";
echo "解密密字符串:".$jieData;

 二、新3des加解密方法

<?php
class TripleDes {
    private $key;
    private $iv;

    public function __construct($key, $iv) {
        $this->key = $key;
        $this->iv = $iv;
    }

    public function encrypt($data) {
        $encrypted = openssl_encrypt($data, 'des-ede3-cbc', $this->key, OPENSSL_RAW_DATA, $this->iv);
        return base64_encode($encrypted);
    }

    public function decrypt($encryptedData) {
        $decrypted = openssl_decrypt(base64_decode($encryptedData), 'des-ede3-cbc', $this->key, OPENSSL_RAW_DATA, $this->iv);
        return $decrypted;
    }
}
$key = "2312342132"; 
$iv = "12345678"; // 初始化向量长度必须为8位
$des = new TripleDes($key, $iv);
$data = "adsadb123";
echo "要加密的数据:{$data}\n";
$encrypted = $des->encrypt($data);
echo "加密后的数据:" . $encrypted . "\n";
$decrypted = $des->decrypt($encrypted);
echo "解密后的数据:" . $decrypted . "\n";

 在上面的代码中,我们创建了一个名为TripleDes的类,该类有一个构造函数用于初始化密钥和初始化向量。类中定义了encrypt()decrypt()方法,用于进行加密和解密操作。 在使用时,首先创建一个TripleDes的实例,并将密钥和初始化向量作为参数传递给构造函数。 然后,通过调用实例的encrypt()方法来对数据进行加密,调用decrypt()方法来对数据进行解密。 请注意,3DES算法已经不再被认为是安全的加密算法,推荐使用更安全的算法如AES来替代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

blender 用蒙版添加材质

一、添加材质常规方法 选择物体新建材质&#xff0c;shift a 新建图像纹理&#xff0c;此时会发现添加上的纹理会有接缝&#xff0c;shift a 新建映射 纹理坐标&#xff0c;纹理坐标选择生成&#xff0c;此时&#xff0c;之前的接缝便会消失&#xff1b; 如何快捷添加纹理坐…

【应用】Asible自动化运维工具的应用与常用命令

ansible自动化运维工具 一、ansible 的概述1. ansible 的概念2. ansible 的特性 二、ansible 的部署与命令1. ansible 的部署1.1 服务器ip地址设置1.2 ansible 服务器部署 2. ansible 命令行模块2.1 command 模块2.2 shell 模块2.3 cron 模块2.4 user 模块2.5 group 模块2.6 co…

TCP KeepAlive与HTTP Keep-Alive

TCP KeepAlive与HTTP Keep-Alive TCP KeepAliveHTTP Keep-AliveTCP服务器怎么检测客户端断开连接 TCP KeepAlive TCP连接建立之后&#xff0c;如果应用程序或者上层协议一直不发送数据&#xff0c;或者隔很长时间才发送一次数据&#xff0c;那么TCP需要判断是应用程序掉线了还…

postgresql|数据库|启动数据库时报错:FATAL: could not map anonymous shared memory的解决

前言&#xff1a; 一个很偶然的出现的问题&#xff0c;因为我需要验证备份文件是否正确&#xff0c;因此&#xff0c;我在一台已启动了一个数据库实例的服务器上&#xff0c;依据全备的数据库文件在启动一个实例&#xff0c;当然&#xff0c;在此之前&#xff0c;已经修改了备…

C语言习题练习

C语言习题练习 一、offsetof宏二、交换奇偶位三、原地移除数组总结 一、offsetof宏 首先我们要了解什么是offsetof宏&#xff1a; . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值&#xff08;以字节为单位&#xff09;。 . 返回的值是size_t类型的无符号整数…

DevOps(四)

CD(二) 1. CDStep 1 - 上传代码Step 2 - 下载代码Step 3 - 检查代码Step 4 - 编译代码Step 5 - 上传仓库Step 6 - 下载软件Step 7 - 制作镜像Step 8 - 上传镜像Step 9 - 部署服务2. 整体预览2.1 预览1. 修改代码2. 查看sonarqube检查结果3. 查看nexus仓库4. 查看harbor仓库5.…

【打卡】Datawhale暑期实训ML赛事

文章目录 赛题描述任务要求数据集介绍评估指标 赛题分析基于LightGBM模型Baseline详解改进baseline早停法添加特征 赛题描述 赛事地址&#xff1a;科大讯飞锂离子电池生产参数调控及生产温度预测挑战赛 任务要求 初赛任务&#xff1a;初赛提供了电炉17个温区的实际生产数据&…

字典树Trie

Trie树又称字典树&#xff0c;前缀树。是一种可以高效查询前缀字符串的树&#xff0c;典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎系统用于文本词频统计。 它的优点是&#xff1a;利用字符串…

欧姆龙 NJ SNMP 协议的使用,用于监控PLC的网络状态

NJ SNMP 协议的使用 实验时间&#xff1a;2023.07.25 实验器材&#xff1a;NJ501-1300 实验目的&#xff1a;NJ SNMP 协议的使用 1. SNMP 协议介绍 ​ SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种简单网络管理协议。它属于 TCP/IP 五层协议中的…

Cerbero Suite Advanced Crack

Cerbero Suite Advanced Crack 用于软件分类和文件分析的最先进的工具套件。分析多种文件格式&#xff0c;包括PE、Mach-O、ELF、Java、SWF、DEX、PDF、DOC、XLS、RTF、Zip等。 它提供自动分析、交互式分析、Carbon interactive Disassembler、字节码反汇编程序、带布局的十六进…

一篇文章搞定《EventBus详解》

一篇文章搞定《EventBus详解》 前言EventBus简述EventBus的使用EventBus源码解析初始化并构建实例EventBus.getDefault()EventBus.builder()EventBus初始化的重要成员 注册流程register方法SubscriberMethodFinder类findSubscriberMethods方法findUsingReflection方法&#xff…

掌握Python的X篇_10+11_if分支语句、else语句、elif语句

文章目录 1. if关键字及语法2. 语句块的概念3. else语句4. elif语句 1. if关键字及语法 基本语法如下&#xff1a; if 条件表达式:条件为True时&#xff0c;要执行的语句举例&#xff1a; number int(input("Input an number")) if number > 5 :print("这…

【Spring框架】spring对象注入的三种方法

目录 1.属性注入问题&#xff1a;同类型的Bean存储到容器多个&#xff0c;获取时报错的问题&#xff1b;1.将属性的名字和Bean的名字对应上。2.使用AutoWiredQualifier来筛选bean对象&#xff1b; 属性注入优缺点 2.Setter注入Setter注入优缺点 3.构造方法注入&#xff08;Spri…

Node.js 安装与版本管理(nvm 的使用)

安装 Node.js Node.js 诞生于 2009 年 5 月&#xff0c;截至今天&#xff08;2022 年 3 月 26 号&#xff09;的最新版本为 16.14.2 LTS 和 17.8.0 Current&#xff0c;可以去官网下载合适的版本。 其中&#xff0c;LTS&#xff08;Long Term Support&#xff09; 是长期维护…

MySQL基础扎实——主键与候选键

词义解释 主键&#xff08;Primary Key&#xff09;和候选键&#xff08;Candidate Key&#xff09;是关系型数据库中的术语&#xff0c;用于标识和唯一确定表中的记录。它们之间有以下区别&#xff1a; 唯一性&#xff1a;主键是表中的唯一标识&#xff0c;每个表只能有一个主…

环境保护数据传输系统监测环境指标

嵌入式实时操作系统&#xff08;RTOS&#xff09;是一种专门设计用于嵌入式系统的操作系统。它具有实时性能和低延迟的特点&#xff0c;能够满足对时间响应性要求较高的应用。本文介绍了一种具备Modbus Slave和Modbus Master功能的嵌入式实时操作系统设备&#xff0c;以及其扩展…

OpenGL Metal Shader 编程:ShaderToy 内置全局变量

OpenGL & Metal Shader 编程&#xff1a;ShaderToy 内置全局变量 前面发了一些关于 Shader 编程的文章&#xff0c;有读者反馈太碎片化了&#xff0c;希望这里能整理出来一个系列&#xff0c;方便系统的学习一下 Shader 编程。 由于主流的 Shader 编程网站&#xff0c;如…

Dart - 语法糖(持续更新)

文章目录 前言开发环境中间表示语法糖1. 操作符/运算符&#xff08;?./??/??/../?../.../...?&#xff09;2. 循环&#xff08;for-in&#xff09;3. 函数/方法&#xff08;>&#xff09;4. 关键字&#xff08;await for&#xff09; 最后 前言 通过将dill文件序列化…

【时间序列预测 2023 ICLR】TimesNet

【时间序列预测 2023 ICLR】TimesNet 论文题目&#xff1a;TIMESNET: TEMPORAL 2D-VARIATION MODELING FOR GENERAL TIME SERIES ANALYSIS 中文题目&#xff1a;TimesNet:用于一般时间序列分析的时态二维变异建模 论文链接&#xff1a;https://arxiv.org/abs/2210.02186 论文代…

大专同事一个人7天完成CRM系统开发,怪不得月薪3w

在当今的快节奏商业环境中&#xff0c;成功的关键是敏捷和高效。这使得开发自己的客户关系管理系统&#xff08;CRM&#xff09;成为许多企业的迫切需求。CRM有助于跟踪和优化销售线索&#xff0c;管理客户交互&#xff0c;并提高业务效率。但是&#xff0c;对于许多企业来说&a…