php - ci里怎么使用3des加密?

查看:137
本文介绍了php - ci里怎么使用3des加密?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

原来是使用下面这个类做的3des加密,但是升级PHP7.1后,mcrypt整个移除了,现在用的是ci框架,它应该是支持3des加密的,但是加密出来的字符串跟以前的不一样,请问ci里应该怎么加密?或者PHP7.1怎么做到3des加密?因为现在需要对接一个外部系统,他们要求用3des加密...

<?php
class Des3 {

public static function encrypt($str, $key) {
    $td = self::gettd($key);
    $ret = strtoupper(bin2hex(mcrypt_generic($td, self::pkcs5_pad($str, 8))));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $ret;
}

public static function decrypt($str, $key) {
    $td = self::gettd($key);
    $ret = self::pkcs5_unpad(mdecrypt_generic($td, self::hex2bin(strtolower($str))));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $ret;
}

public static function hex2bin($hexData) {
    $binData = "";
    for($i = 0; $i  < strlen ( $hexData ); $i += 2) {
        $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
    }
    return $binData;
}

private static function pkcs5_pad($text, $blocksize) {
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

private static function pkcs5_unpad($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);
}

private static function getiv() {
    return pack('H16', '0102030405060708');
}

private static function gettd($key) {
    $iv = self::getiv();
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
    @mcrypt_generic_init($td, $key, $iv);
    return $td;
}
}


现在使用1楼码友的推荐,用了 openssl_encrypt ,但是这个不知道怎样才能设置成是 3des 加密,我是这样的:

$sign = openssl_encrypt (
        'abc9966',
        'des-ede3-cbc' ,//感觉是这个函数没用对,但该用哪个呢?
        'ABCLYHG22r5juqqlFRVfYdse',
        0 ,//OPENSSL_RAW_DATA OPENSSL_ZERO_PADDING
        '' //也有可能是 iv 没设置,该怎样设置呢?
        );
        

加密出来的串也不对


ci我是这样加密的,当然,加密出来的串也是不对的:

$sign2 = $this->encryption->encrypt(
        'abc9966',
        array(
            'driver' => 'openssl',
            'cipher' => 'tripledes',
            'mode' => 'cbc',
            'hmac'=>false,
            'raw_data'=>true,
            'key' => 'ABCLYHG22r5juqqlFRVfYdse',
        )
    );
    

请问ci里应该怎么加密?或者PHP7.1怎么做到3des加密?


ci里, tripledes 支持的密钥长度是 56112168,但是我的密钥是24,这个有问题吗?但是接口那边给的密钥就是这个长度,PHP用旧的那个类加密出来他们是可以解密的,ci自带类就不行...


找到一篇文章:http://blog.csdn.net/aloneswo...,里面提到3des-ecb加密方式;24位密钥,不足24位的右补0x00;。这与ci的说法不一致,而且ci里提到的3des并不支持ecb模式


最终能加密了!!!感谢一楼码友的提醒!!!
加密方法我写在此问题的答案中,为了感谢1楼,所以没有采纳我自己的答案

解决方案

以前用这个库加密,现在用ci的话也可以用这个库加密,将它放到ci项目的libraries目录下(一般为application\libraries),命名为Des3.php

然后在控制器中载入这个类,$this->load->library('Des3')Des3首字母大小写无所谓,但是对应文件和类名要一致且除了首字母之外的大写会被强制转换成小写,所以不建议在中间使用大写字母);

载入之后,在控制器中,使用$this->des3->encrypt()就可以使用Des3类里面的encrypt方法了,其他类似。

Update

鉴于7.1废弃了mcrypt库,建议使用openssl_encryptopenssl_decrypt进行加密解密。

参见:
https://stackoverflow.com/que...
http://php.net/manual/en/func...

这篇关于php - ci里怎么使用3des加密?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆