PHP版DES算法加密数据(3DES)另附openssl_encrypt版本

PHP版DES算法加密数据(3DES)

可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容

<?php
/**
 * Created by PhpStorm.
 * Title:PHP版DES加解密类
 *        可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容
 * User: yaokai
 * Date: 2017/11/13 0013
 * Time: 19:03
 */

namespace App\Http\Libs;

class Des
{
    private static $_instance = NULL;
    var $key;//秘钥向量
    var $iv;//混淆向量 ->偏移量

    function __construct()
    {
        $this->key = env(‘DES_KEY‘);
        $this->iv = env(‘DES_IV‘);
    }

    /**
     *
     * @User yaokai
     * @return Des|null
     */
    public static function share()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new Des();
        }
        return self::$_instance;
    }

    /**
     * 加密算法
     * @User yaokai
     * @param $input 要加密的数据
     * @return string 返回加密后的字符串
     */
    function encrypt($input)
    {
        //获得加密算法的分组大小  8
        $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); //3DES加密将MCRYPT_DES改为MCRYPT_3DES
        //ascii 填充
        $input = $this->pkcs5_pad($input, $size); //如果采用PaddingPKCS7,请更换成PaddingPKCS7方法。
        //用0填充秘钥为指定长度8
        $key = str_pad($this->key, 8, ‘0‘); //3DES加密将8改为24
        //打开算法和模式对应的模块
        $td = mcrypt_module_open(MCRYPT_DES, ‘‘, MCRYPT_MODE_CBC, ‘‘);
        //判断混淆向量是否为空
        if ($this->iv == ‘‘) {
            //从算法源随机生成混淆向量
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//类似b"¨ß^\f\x1EÅ╩5"
        } else {
            //反之取设置的混淆向量
            $iv = $this->iv;
        }
        //初始化加密所需的缓冲区
        @mcrypt_generic_init($td, $key, $iv);
        //加密数据  $td为算法对象模块  $input为处理过后的值
        $data = mcrypt_generic($td, $input);// 类似b"ýyP\x7FN\x00èiÝd>À?s\x18Î"
        //对加密模块进行清理工作
        mcrypt_generic_deinit($td);
        //关闭加密模块
        mcrypt_module_close($td);
        //使用 MIME base64 对数据进行编码
        $data = base64_encode($data);//如需转换二进制可改成 bin2hex 转换
        //如果设置了混淆向量 则加密的值是固定的   如果没设置混淆向量 则加密的值是随机的
        return $data;
    }

    /**
     * 解密算法
     * @User yaokai
     * @param $encrypted 加密后的字符串
     * @return bool|string
     */
    function decrypt($encrypted)
    {
        //对使用 MIME base64 编码的数据进行解码
        $encrypted = base64_decode($encrypted); //如需转换二进制可改成 bin2hex 转换
        //使用另一个字符串填充字符串为指定长度 获取秘钥
        $key = str_pad($this->key, 8, ‘0‘); //3DES加密将8改为24
        //打开算法和模式对应的模块
        $td = mcrypt_module_open(MCRYPT_DES, ‘‘, MCRYPT_MODE_CBC, ‘‘);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
        //判断混淆向量是否为空
        if ($this->iv == ‘‘) {
            //从算法源随机生成混淆向量
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            //反之取设置的混淆向量
            $iv = $this->iv;
        }
        //返回打开的模式所能支持的最长密钥  没用上
        $ks = mcrypt_enc_get_key_size($td);//DES 8   3DES 24
        //初始化加密所需的缓冲区
        @mcrypt_generic_init($td, $key, $iv);
        //解密数据  $td为算法对象模块  $encrypted为需要解密的数据
        $decrypted = mdecrypt_generic($td, $encrypted);//类似于 "15549070665\x05\x05\x05\x05\x05" 之前加密的数据
        //对加密模块进行清理工作
        mcrypt_generic_deinit($td);
        //关闭加密模块
        mcrypt_module_close($td);
        //返回取出解密数据
        $data = $this->pkcs5_unpad($decrypted);

        return $data;
    }

    /**
     * 填补需加密的字符串
     * PKCS7Padding VS PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @User yaokai
     * @param $text
     * @param $blocksize
     * @return string
     */
    function pkcs5_pad($text, $blocksize)
    {
        //$pad=5  blocksize=11  $test=8  %取余
        $pad = $blocksize - (strlen($text) % $blocksize);//5
        //返回ascii填补后的字符串, 类似 "15549070665\x05\x05\x05\x05\x05"
        return $text . str_repeat(chr($pad), $pad);
    }

    /**
     * 去除加密填补的字符串
     * PKCS7Padding VS PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @User yaokai
     * @param $text
     * @return bool|string
     */
    function pkcs5_unpad($text)
    {
        //取出最后一个字符串 {15}   ord返回字符的 ASCII 码值
        $pad = ord($text{strlen($text) - 1});//5
        //判断$pad的值是否大于本身字符串
        if ($pad > strlen($text)) {
            //如果大于  则多余
            return false;
        }
        //计算ASCII 码值中全部字符都存在于$text字符集合中的第一段子串的长度是否等于取出的$pad
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            //如果不相等  则缺失
            return false;
        }
        //返回字符串的子串
        return substr($text, 0, -1 * $pad);
    }

    /**
     * 填补需加密的字符串
     * PKCS7Padding VS PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @User yaokai
     * @param $text
     * @param $blocksize
     * @return string
     */
    function PaddingPKCS7($data)
    {
        $block_size = mcrypt_get_block_size(MCRYPTDES, MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }

    /**
     * 去除加密填补的字符串
     * PKCS7Padding VS PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @User yaokai
     * @param $text
     * @return bool|string
     */
    private function UnPaddingPKCS7($text)
    {
        $pad = ord($text{strlen($text) - 1});
        if ($pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, -1 * $pad);
    }

}

由于php7.1废弃了mcrypt_* 一系列函数 所以采用 openssl版本

/**
* des3加密
* @author bug  <[email protected]>
* @createtime 2019-04-17 17:30:53
* @param $str 要加密的数据
* @param $des_key 秘钥向量
* @param $des_iv 混淆向量 ->偏移量
* @return
*/
if(!function_exists(‘des3_encrypt‘)){
  function des3_encrypt($str,$des_key="",$des_iv="")
  {
      return base64_encode(openssl_encrypt($str, ‘des-ede3-cbc‘, $des_key, OPENSSL_RAW_DATA, $des_iv));
  }
}

原文地址:https://www.cnblogs.com/xiami2046/p/12693237.html

时间: 2024-10-30 09:52:57

PHP版DES算法加密数据(3DES)另附openssl_encrypt版本的相关文章

python 版DES和MAC算法

最近工作中需要用到python中的DES算法,虽然有现成的库,但总感觉用着不方便.于是把之前用的C和Java写的DES和MAC算法移植到python中.测试了下没问题. 这样以后就方便了,.在python中终于可以用DES算法了.之前把C写的DES算法封装成动态库,然后由python的ctypes调用,虽然可以但是不是很方便. 附:python版DES算法源码,还未封装成类,仍在完善中.源码CSDN资源中可下载.直接编译执行没问题. #!/usr/bin/env python # -*- cod

DES算法详解与源码

网上关于DES算法的讲述有很多,大致思路一致.但是很多细节的处理上没有交代清楚,源码质量也参差不齐,为此也花了很多时间研究了一下,现在把完整思路和源码整理如下. 1. DES算法简介: DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法. 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8.16.24.32.40.48.56.64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或

Asp.Net 常用工具类之加密——对称加密DES算法(2)

又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有个家(毕竟年级不小了),有盼头的工作前景. 看到老赵和老跳两位前辈的故事,真实且现实,同时也有一丢丢的小迷茫,敢问路在何方! 感叹一会儿,生命不止,Code不止,继续入坑! 昨天分享了一下非对称加密RSA算法,今天给朋友们分享一下对称加密DES算法案例. 加解密过程: 1.生成加密密钥key,密码越

DES算法解析

DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES,Data Encryption Standard). 一.DES算法 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算

AES算法,DES算法,RSA算法JAVA实现

1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计简单. 当前的大多数分组密码,其轮函数是Feistel结构. Rijndael没有这种结构. Rijndael轮函数是由3个不同的可逆均匀变换 1.1.2      密码说明 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大

DES算法学习

密码学课程上老师讲DES很清楚,然而分成了几节课来讲总是断断续续的,理解的不够全面还容易忘记,因此这篇文章特地好好学习一些DES算法,并努力争取学习完后自己写出c程序. 本文内容大多翻译自J.Orlin Grabbe的The DES Algorithm Illustrated,外加一些自己的理解 背景 数据加密标准(Data Encryption Standard, DES)是一种对称密钥.块加密的加密算法 1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

DES算法详解

本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法. 密钥长64位,密钥事实上是56位参与DES运算(第8.16.24.32.40.48.56.64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组. DES算法的主要流程如下图

wex5 实战 加密与解密系列(1) DES算法引入与调用

作为web前端应用来说,与服务器通讯或后端通讯,以及不同用户间传递数据,在一些特定情况下需要对一些信息进行加密传输,在某个事件中取出信息并解密,得到正确的信息.纵观不同语言和不同算法,有很多种选择.今天,从最基础的加密与解密算法DES说起,深入浅出,看看wex5如何简单高效的实现DES算法加密与解密.便于课程需要,制作了demo,及js改装注释. 一 效果演示 如图所示,加密,生成一堆乱码,解密还原得到正确信息. 二 设计思路 制作并引入des.js文件,前端直接调用js方法实现加密解密. 三