About PHP and JAVA 3DES encryption issues
给我你的怀抱
给我你的怀抱 2017-06-15 09:21:44
0
1
799

I want to write an encryption class in Java using PHP, but I saw this way of writing Java and it gave me a headache. Totally illogical. I found a complete class and wanted to refer to it. After many experiments, I could not translate the encryption class I uploaded into PHP. Please help me. Thanks.

/**

  • 3Des help class

  • */

public class ThreeDESUtil {

private static final String Algorithm = "DESede"; // 定义 加密算法,可用 // DES,DESede,Blowfish private static byte[] keybyte = { 0x11, 0x28, 0x4F, 0x58, (byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36, (byte) 0xE2 }; // 24字节的密钥 public static String encryptMode(String src) { String encrypt = null; try { byte[] ret = encryptMode(src.getBytes("UTF-8")); encrypt = new String(Base64.encode(ret)); encrypt = encrypt.replaceAll("=", "Q"); } catch (Exception e) { logger.error("ThreeDES Error"); } return encrypt; } /** * 加密 * * @param src * @return */ private static byte[] encryptMode(byte[] src) { try { // 生成密钥 SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); // 加密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); return c1.doFinal(src); } catch (Exception e) { logger.error("ThreeDES Error"); } return null; } // for test public static void main(String[] args) { String szSrc = "12345678"; String encoded = encryptMode(szSrc); System.out.println("加密后的字符串:" + encoded); //1xZ9Hssih5z0pegyf7aUcgQQ }

}

The above is the java class I need to convert into PHP,

Attached is the following reference article
/q/10...

The following is the PHP code I wrote after reference.

$EasyCrypt3Des = new EasyCrypt3Des(); echo $EasyCrypt3Des->encrypt('12345678'); //java 结果 '1xZ9Hssih5z0pegyf7aUcgQQ'; exit; class EasyCrypt3Des { private $_key = array("0x11", "0x28", "0x4F", "0x58", "0x88", "0x10", "0x40", "0x38", "0x28", "0x25", "0x79", "0x51","0xCB", "0xDD", "0x55", "0x66", "0x77", "0x29", "0x74", "0x98", "0x30", "0x40", "0x36", "0xE2"); private $keyStr = ""; public function __construct() { foreach($this->_key as $keyItem) { $this->keyStr .= $this->hexToStr($keyItem); } } public function encrypt($str) { $td = $this->gettd(); $ret = mcrypt_generic($td,$str); mcrypt_generic_deinit($td); mcrypt_module_close($td); $result = base64_encode($ret); return str_replace('=','Q',$result); } private function getiv() { return pack('H16','0000000000000000'); } private function gettd() { $iv = $this->getiv(); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, ''); mcrypt_generic_init($td, $this->keyStr,$iv); return $td; } private function hexToStr($hex){ $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2){ $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } }
给我你的怀抱
给我你的怀抱

reply all (1)
刘奇

The problem has been solved, please refer to the previous article:
1. The encrypted characters are not converted into characters, so they cannot be decrypted. One step is missing.
2. Refer to the article link I posted, the PHP class is completely universal. You can ignore the code I posted before, I will compile another correct one.

java

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class ThreeDES {

private static final String Algorithm = "DESede"; //Define encryption algorithm, available DES, DESede, Blowfish

//keybyte为加密密钥,长度为24字节 //src为被加密的数据缓冲区(源) public static byte[] encryptMode(byte[] keybyte, byte[] src) { try { //生成密钥 SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); //加密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } //keybyte为加密密钥,长度为24字节 //src为加密后的缓冲区 public static byte[] decryptMode(byte[] keybyte, byte[] src) { try { //生成密钥 SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); //解密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.DECRYPT_MODE, deskey); return c1.doFinal(src); } catch (java.security.NoSuchAlgorithmException e1) { e1.printStackTrace(); } catch (javax.crypto.NoSuchPaddingException e2) { e2.printStackTrace(); } catch (java.lang.Exception e3) { e3.printStackTrace(); } return null; } //转换成十六进制字符串 public static String byte2hex(byte[] b) { String hs=""; String stmp=""; for (int n=0;n

}

The above code is completely taken from /q/10...

The following is the PHP code.

class EasyCrypt3Des {

private $_key = ""; public function __construct() { $keyItem = array( '0x11','0x28','0x4F','0x58','0x88','0x10','0x40','0x38','0x28','0x25','0x79','0x51', '0xCB','0xDD','0x55','0x66','0x77','0x29','0x74','0x98','0x30','0x40','0x36','0xE2' ); foreach($keyItem as $kitem) { //转换成字符 $this->_key .= chr($kitem); } } public function encrypt($str) { $td = $this->gettd(); $ret = mcrypt_generic($td, $this->pkcs5_pad($str, 8)); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $this->strToHex($ret); } public function decrypt($str) { $td = $this->gettd(); $ret = $this->pkcs5_unpad(mdecrypt_generic($td, $this->hexToStr($str))); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } private function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } private 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 function getiv() { return pack('H16', '0000000000000000'); } private function gettd() { $iv = $this->getiv(); $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, ''); mcrypt_generic_init($td, $this->_key, $iv); return $td; } private function strToHex($string){ $hex = ''; for ($i=0; $i

}
$EasyCrypt3Des = new EasyCrypt3Des();
$code = $EasyCrypt3Des->encrypt('12345678');
echo $code .'
';
echo $EasyCrypt3Des->decrypt( $code);
exit;

Mainly lies in character conversion.

    Latest Downloads
    More>
    Web Effects
    Website Source Code
    Website Materials
    Front End Template
    About us Disclaimer Sitemap
    php.cn:Public welfare online PHP training,Help PHP learners grow quickly!