• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现基于3DES算法加密解密字符串示例

    本文实例讲述了PHP实现基于3DES算法加密解密字符串。分享给大家供大家参考,具体如下:

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

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

    一、为什么要进行数据加密

    数据的安全性越来越得以重视。举个例子说,保存在数据库中的用户密码并不是明文保存的,而是采用md5加密后存储,这样即使数据库被脱库,仍能保证用户密码安全。但是,md5是不可逆的,开发人员根本就不知道用户的密码到底是什么。有些时候,我们希望加密后存储的数据是可逆的,比如一些接口密钥,这样即使数据库被脱库,如果没有对应的解密方式,攻击者盗取的密钥也是不能使用的。

    二、3DES加密简介

    3DES(即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: 黎志斌
    * @version: v1.0
    * 2016年7月21日
    */
    class Encrypt
    {
      //加密秘钥,
      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));
        //加密数据长度处理
        $str = $this->strPad($str, mcrypt_enc_get_block_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 $result;
      }
      /**
      * 对加密的字符串进行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;
        }
        $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);
      }
    }
    $key  = 'ABCEDFGHIJKLMNOPQ';
    $iv  = '0123456789';
    $des = new Encrypt($key, $iv);
    $str = "abcdefghijklmnopq";
    echo "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之后再保存,以下是PHP官网上的建议:

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

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

    在线DES加密/解密工具
    http://tools.jb51.net/password/des_encode

    MD5在线加密工具:
    http://tools.jb51.net/password/CreateMD5Password

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

    在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
    http://tools.jb51.net/password/hash_md5_sha

    在线sha1/sha224/sha256/sha384/sha512加密工具:
    http://tools.jb51.net/password/sha_encode

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

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 六种php加密解密方法实例讲解
    • PHP rsa加密解密算法原理解析
    • 基于PHP实现解密或加密Cloudflar邮箱保护
    • php中加密解密DES类的简单使用方法示例
    • php的RSA加密解密算法原理与用法分析
    • RSA实现JS前端加密与PHP后端解密功能示例
    • Js通过AES加密后PHP用Openssl解密的方法
    • PHP实现的AES双向加密解密功能示例【128位】
    • PHP实现的XXTEA加密解密算法示例
    • PHP实现的AES加密、解密封装类与用法示例
    • PHP实现的DES加密解密类定义与用法示例
    • 基于PHP RSA密文过长加密解密 越过1024的解决方法
    • PHP的RSA加密解密方法以及开发接口使用
    • PHP使用自定义key实现对数据加密解密的方法
    • php实现的三个常用加密解密功能函数示例
    • PHP代码加密和扩展解密实战
    上一篇:PHP与以太坊交互详解
    下一篇:PHP操作Redis数据库常用方法示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

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