手机版

基于3DES算法的加解密字符串的PHP实现示例

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

本文给出了一个例子来说明PHP如何基于3DES算法对字符串进行加密和解密。分享给大家参考,如下:

3DES(或三重DES)是三重数据加密算法(TDEA)分组密码的总称。相当于对每个数据块应用DES加密算法三次。由于计算机计算能力的增强,原始DES密码的密钥长度变得容易被暴力破解;3DES旨在提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的分组密码算法。

项目地址:https://github.com/lizhibin205/lizhibin-php-mcrypt

首先,为什么要加密数据

数据安全越来越受到重视。比如存储在数据库中的用户密码不是明文存储的,而是用md5加密的,这样即使把数据库从数据库中拿掉,用户密码的安全性还是可以保证的。然而,md5是不可逆的,开发人员根本不知道用户的密码是什么。有时候,我们希望加密的数据是可逆的,比如一些接口密钥,这样即使数据库从数据库中被拿走,如果没有相应的解密方法,攻击者窃取的密钥也无法使用。

二.3DES加密简介

三重DES (triple DES)是一种从DES过渡到AES的加密算法(1999年NIST指定3-DES作为过渡加密标准)。加密算法实现如下:让Ek()和Dk()代表des算法的加密和解密过程,k代表des算法使用的密钥,m代表明文,c代表密文。

3DES的加密过程是:C=Ek3(Dk2(Ek1(M)))

3DES解密过程为:M=Dk1(EK2(Dk3(C)))

三、用PHP实现3DES加密

1.用PHP实现3DES流程图

要使用上述函数,必须在编译PHP时添加- with-mcrypt选项。

2.PHP实现了3DES代码

?php/*** 3DES加解密类* @Author:黎志斌* @版本: v1.0* 2016年七月21日*/class Encrypt{ //加密秘钥,private $ _ key private $ _ ivpublic function _ _ construct($ key,$ iv){ $ this-_ key=$ key;$ this-_ iv=$ iv;} /** * 对字符串进行3DES加密* @param字符串要加密的字符串* @返回混合加密成功返回加密后的字符串,否则返回false */public function encrypt3DES($ str){ $ TD=MCRYPT _ module _ open(MCRYPT _ 3DES ' ',MCRYPT _ MODE _ CBC ' ');if($ TD===false){ return false;} //检查加密钥匙,四的长度是否符合算法要求$key=$this-fixLen($this-_key,mcrypt _ enc _ get _ key _ size($ TD));$iv=$this-fixLen($this-_iv,MC rypt _ enc _ get _ iv _ size($ TD));//加密数据长度处理$str=$this-strPad($str,mcrypt _ enc _ get _ block _ size($ TD));if (mcrypt_generic_init($td,$key,$iv)!==0) {返回false } $ result=MC rypt _ generic($ TD,$ str);MC rypt _ generic _ defin it($ TD);MC rypt _ module _ close($ TD);返回$ result} /** *对加密的字符串进行3DES解密* @param字符串要解密的字符串* @返回混合加密成功返回加密后的字符串,否则返回false */public function decrypt3DES($ str){ $ TD=MCRYPT _ module _ open(MCRYPT _ 3DES ' ',MCRYPT _ MODE _ CBC ' ');if($ TD===false){ return false;} //检查加密钥匙,四的长度是否符合算法要求$key=$this-fixLen($this-_key,mcrypt _ enc _ get _ key _ size($ TD));$iv=$this-fixLen($this-_iv,MC rypt _ enc _ get _ iv _ size($ TD));if (mcrypt_generic_init($td,$key,$iv)!==0) {返回false } $ result=mdecrypt _ generic($ TD,$ str);MC rypt _ generic _ defin it($ TD);MC rypt _ module _ close($ TD);返回$ this-StrunPad($ result);} /** * 返回适合算法长度的钥匙,四字符串* @param string $str键或输入阀交互式视讯自变量(独立变量)的值* @param int $td_len符合条件的键或输入阀交互式视讯自变量(独立变量)长度* @返回字符串返回处理后的键或输入阀交互式视讯自变量(独立变量)值*/私有函数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 ');}返回$ str} /** *返回适合算法的分组大小的字符串长度,末尾使用\0补齐* @param string $str要加密的字符串* @param int $td_group_len符合算法的分组长度* @返回字符串返回处理后字符串*/私有函数strPad($str,$ TD _ group _ len){ $ padding _ len=$ TD _ group _ len-(strlen($ str)% $ TD _ group _ len);返回str_pad($str,strlen($str) $padding_len,' \ 0 ');} /** * 返回适合算法的分组大小的字符串长度,末尾使用\0补齐* @param string $str要加密的字符串* @返回字符串返回处理后字符串*/private function StrunPad($ str){ return rtrim($ str);} } $ key=' ABCEDFGHIJKLMNOPQ $ iv=' 0123456789 $ des=新的加密($key,$ iv);$ str=' abcdefghijklmnopqecho ' source : { $ str },len: ',strlen($str),' \ r \ n ';$ e _ str=$ des-encrypt3DES($ str);echo 'entrypt: ',$e_str,' \ r \ n ';$ d _ str=$ des-decrypt3DES($ e _ str);echo 'dntrypt: {$d_str},len: ',strlen($d_str),' \ r \ n ';注意,如果要在数据库中保存加密后的数据,建议base64_encode之后再保存,以下是服务器端编程语言(专业超文本预处理器的缩写)官网上的建议:

如果你在例如关系型数据库这样的数据库中存储数据,请注意可变长字符串类型的字段会在插入数据时自动移除字符串末尾的"空格"。由于加密后的数据可能是以空格(ASCII 32)结尾,这种特性会导致数据损坏。请使用tinyblob/tinytext(或更大)字段来存储加密数据。

PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

在线数据加密标准加密/解密工具http://tools.jb51.net/password/des_encode

讯息摘要5在线加密工具:http://tools.jb51.net/password/CreateMD5Password

在线散列/哈希算法加密工具:http://tools.jb51.net/password/hash_encrypt

在线MD5/哈希/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:http://tools.jb51.net/password/hash_md5_sha

在线sha1/sha 224/sha 256/sha 384/sha 512加密工具:http://tools.jb51.net/password/sha_encode

更多对PHP相关内容感兴趣的读者可以查看本网站的话题:《php加密方法总结》、《PHP编码与转码操作技巧汇总》、《PHP数学运算技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《php正则表达式用法总结》、0103010。

希望本文对PHP编程有所帮助。

版权声明:基于3DES算法的加解密字符串的PHP实现示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。