高分求解!!!这段JAVA代码如果用PHP怎么实现

m0_38052531 2018-06-11 01:50:25

/**
* 主解密方法
*/
String key = "baea543738eff1cd1923da027f078c5da873fee3e5b00138";
String input = "4b07b83e7d4ab77d81e71aa6a900e4ea593fcf64df086fb4";
public String decrypt3DES(String input, String key){
argsCheckService.checkStringNotEmpty(input);
argsCheckService.checkStringNotEmpty(key);

byte[] inputByte = EncodesUtils.decodeHex(input);
byte[] tripleDesResultByte = TripleDesUtil.decryptECBMode(inputByte, EncodesUtils.decodeHex(key));
String tripleDesResult = new String(tripleDesResultByte, Charsets.UTF_8);
return tripleDesResult;
}
/**
* Hex解码部分.
*/
public static byte[] decodeHex(String input) {
try {
return Hex.decodeHex(input.toCharArray());
} catch (DecoderException e) {
throw ExceptionUtils.unchecked(e);
}
}

/**
* 3DES解密部分 ECB模式
* @param src 待解密的字节数组
* @param key 解密的密钥
* @return
*/
public static byte[] decryptECBMode(byte[] src, byte[] key) {
try {
DESedeKeySpec dks = new DESedeKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, securekey);
return cipher.doFinal(src);
} catch (java.security.NoSuchAlgorithmException e1) {
logger.error("encryptECBMode", e1);
} catch (javax.crypto.NoSuchPaddingException e2) {
logger.error("encryptECBMode", e2);
} catch (java.lang.Exception e3) {
logger.error("encryptECBMode", e3);
}
return null;
}
...全文
820 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_38052531 2018-06-12
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
byte[] 数组 就是 php 的字符串 只是表现形式不同而已 php 做HEX解码 $ar = unpack('H*', $hex_str) 或 $str = hex1bin($hex_str);
PHP用HEX解码出来组成字符串就是乱码
m0_38052531 2018-06-12
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
byte[] 数组 就是 php 的字符串 只是表现形式不同而已 php 做HEX解码 $ar = unpack('H*', $hex_str) 或 $str = hex1bin($hex_str);
比如:String key = "baea543738eff1cd1923da027f078c5da873fee3e5b00138"; String input = "4b07b83e7d4ab77d81e71aa6a900e4ea593fcf64df086fb4"。这两个字符串做HEX解码得到:key =��T78���#��]�s���8,input =K�>}J�}������Y?�d�o�。然后进行PHP的3DES解密,返回的只能是false,解不出来。
xuzuning 2018-06-12
  • 打赏
  • 举报
回复
byte[] 数组 就是 php 的字符串 只是表现形式不同而已 php 做HEX解码 $ar = unpack('H*', $hex_str) 或 $str = hex1bin($hex_str);
m0_38052531 2018-06-12
  • 打赏
  • 举报
回复
引用 4 楼 weixin_40048408 的回复:

<?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";  
银行传过来一个KEY和input,要求先对两个字符串做HEX解码,再用解码后的数据作3DES-ECB解密,最后得到一个唯一字符串。现在问题是,PHP做3DES解密要传字符串,但JAVA做3DES解密只需要byte[] 数组,byte[] 数组转string字符串会有乱码,也就不能进行下一步3DES解密。
一生小白 2018-06-12
  • 打赏
  • 举报
回复

<?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";  
游北亮 2018-06-12
  • 打赏
  • 举报
回复
你搜索一下:php 3des 加解密
m0_38052531 2018-06-12
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
byte[] 数组 就是 php 的字符串
只是表现形式不同而已

php 做HEX解码
$ar = unpack('H*', $hex_str)

$str = hex1bin($hex_str);
大佬请看,JAVA他只需要解码成这种数组就可以3DES解密了,但是PHP不行啊
m0_38052531 2018-06-11
  • 打赏
  • 举报
回复
m0_38052531 2018-06-11
  • 打赏
  • 举报
回复

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧