Maison >développement back-end >tutoriel php >加密解密 - Java Aes 类,可否用 php 实现,求助于懂 Java 代码的 php 程序猿
Java 代码:
<code>import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESSecurityUtil { private static final String AES = "AES"; private static final String CHARSET_NAME = "utf-8"; private static SecretKeySpec getKey(String password) throws NoSuchAlgorithmException{ KeyGenerator kgen = KeyGenerator.getInstance(AES); SecureRandom random=SecureRandom.getInstance("SHA1PRNG"); random.setSeed(password.getBytes()); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES); return key; } public static String encode(String str, String password) { byte[] arr = encodeToArr(str, password); return byteArrToString(arr); } private static byte[] encodeToArr(String str, String password) { try { Cipher cipher = Cipher.getInstance(AES); byte[] byteContent = str.getBytes(CHARSET_NAME); cipher.init(Cipher.ENCRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(byteContent); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static String decode(String hexStr, String password){ byte[] arr = string2ByteArr(hexStr); return decode(arr, password); } private static String decode(byte[] arr, String password) { try{ Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.DECRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(arr); return new String(result, CHARSET_NAME); }catch (Exception e){ e.printStackTrace(); } return null; } private static String byteArrToString(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i <arr.length i string s="Integer.toString(arr[i]" if sb.append return sb.tostring private static byte string2bytearr str="0123456789ABCDEF" arr="new" for char s1="s.charAt(i" s2="s.charAt(i" int tmp1="str.indexOf(s1)" tmp2="str.indexOf(s2);" public void main args throws exception system.out.println keystr="UITN25LMUQC436IM" plaintext="this is a string will be AES_Encrypt" enctext="encode(plainText,keyStr);" decstring="decode(encText,keyStr);"></arr.length></code>
背景:对方平台语言是Java,参数必须加密,返回数据也是加密后返回,我这边语言是php
问题:这个Java aes 类,能否用php实现,如果能实现,应该如何实现,请指点。
我写的php代码:
<code><?php if (!function_exists('hex2bin')) { function hex2bin($str) { $sbin = ""; $len = strlen($str); for ($i = 0; $i < $len; $i += 2) { $sbin .= pack("H*", substr($str, $i, 2)); } return $sbin; } } class Util_AesEncrypt { private $_cipher = MCRYPT_RIJNDAEL_128; private $_mode = MCRYPT_MODE_ECB; private function _pkcs5Pad($text, $blockSize) { $pad = $blockSize - (strlen($text) % $blockSize); return $text . str_repeat(chr($pad), $pad); } private function _pkcs5Unpad($text) { $end = substr($text, -1); $last = ord($end); $len = strlen($text) - $last; if (substr($text, $len) == str_repeat($end, $last)) { return substr($text, 0, $len); } return false; } public function encrypt($encrypt, $key) { $blockSize = mcrypt_get_block_size($this->_cipher, $this->_mode); $paddedData = $this->_pkcs5Pad($encrypt, $blockSize); $ivSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); $encrypted = mcrypt_encrypt($this->_cipher, $key, $paddedData, $this->_mode, $iv); return bin2hex($encrypted); } public function decrypt($decrypt, $key) { $decoded = hex2bin($decrypt); $blockSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND); $decrypted = mcrypt_decrypt($this->_cipher, $key, $decoded, $this->_mode, $iv); return $this->_pkcs5Unpad($decrypted); } } $keyStr = 'UITN25LMUQC436IM'; $plainText = 'this is a string will be AES_Encrypt'; $aes = new Util_AesEncrypt(); $encText = $aes->encrypt($plainText, $keyStr); $decString = $aes->decrypt($encText, $keyStr); echo $encText, "\n", $decString; </code>
两者运行结果很大差异,并且也没法互相加密解密,应如何改正?
Java 代码:
<code>import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AESSecurityUtil { private static final String AES = "AES"; private static final String CHARSET_NAME = "utf-8"; private static SecretKeySpec getKey(String password) throws NoSuchAlgorithmException{ KeyGenerator kgen = KeyGenerator.getInstance(AES); SecureRandom random=SecureRandom.getInstance("SHA1PRNG"); random.setSeed(password.getBytes()); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES); return key; } public static String encode(String str, String password) { byte[] arr = encodeToArr(str, password); return byteArrToString(arr); } private static byte[] encodeToArr(String str, String password) { try { Cipher cipher = Cipher.getInstance(AES); byte[] byteContent = str.getBytes(CHARSET_NAME); cipher.init(Cipher.ENCRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(byteContent); return result; } catch (Exception e) { e.printStackTrace(); } return null; } public static String decode(String hexStr, String password){ byte[] arr = string2ByteArr(hexStr); return decode(arr, password); } private static String decode(byte[] arr, String password) { try{ Cipher cipher = Cipher.getInstance(AES); cipher.init(Cipher.DECRYPT_MODE, getKey(password)); byte[] result = cipher.doFinal(arr); return new String(result, CHARSET_NAME); }catch (Exception e){ e.printStackTrace(); } return null; } private static String byteArrToString(byte[] arr) { StringBuffer sb = new StringBuffer(); for (int i = 0; i <arr.length i string s="Integer.toString(arr[i]" if sb.append return sb.tostring private static byte string2bytearr str="0123456789ABCDEF" arr="new" for char s1="s.charAt(i" s2="s.charAt(i" int tmp1="str.indexOf(s1)" tmp2="str.indexOf(s2);" public void main args throws exception system.out.println keystr="UITN25LMUQC436IM" plaintext="this is a string will be AES_Encrypt" enctext="encode(plainText,keyStr);" decstring="decode(encText,keyStr);"></arr.length></code>
背景:对方平台语言是Java,参数必须加密,返回数据也是加密后返回,我这边语言是php
问题:这个Java aes 类,能否用php实现,如果能实现,应该如何实现,请指点。
我写的php代码:
<code><?php if (!function_exists('hex2bin')) { function hex2bin($str) { $sbin = ""; $len = strlen($str); for ($i = 0; $i < $len; $i += 2) { $sbin .= pack("H*", substr($str, $i, 2)); } return $sbin; } } class Util_AesEncrypt { private $_cipher = MCRYPT_RIJNDAEL_128; private $_mode = MCRYPT_MODE_ECB; private function _pkcs5Pad($text, $blockSize) { $pad = $blockSize - (strlen($text) % $blockSize); return $text . str_repeat(chr($pad), $pad); } private function _pkcs5Unpad($text) { $end = substr($text, -1); $last = ord($end); $len = strlen($text) - $last; if (substr($text, $len) == str_repeat($end, $last)) { return substr($text, 0, $len); } return false; } public function encrypt($encrypt, $key) { $blockSize = mcrypt_get_block_size($this->_cipher, $this->_mode); $paddedData = $this->_pkcs5Pad($encrypt, $blockSize); $ivSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); $encrypted = mcrypt_encrypt($this->_cipher, $key, $paddedData, $this->_mode, $iv); return bin2hex($encrypted); } public function decrypt($decrypt, $key) { $decoded = hex2bin($decrypt); $blockSize = mcrypt_get_iv_size($this->_cipher, $this->_mode); $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND); $decrypted = mcrypt_decrypt($this->_cipher, $key, $decoded, $this->_mode, $iv); return $this->_pkcs5Unpad($decrypted); } } $keyStr = 'UITN25LMUQC436IM'; $plainText = 'this is a string will be AES_Encrypt'; $aes = new Util_AesEncrypt(); $encText = $aes->encrypt($plainText, $keyStr); $decString = $aes->decrypt($encText, $keyStr); echo $encText, "\n", $decString; </code>
两者运行结果很大差异,并且也没法互相加密解密,应如何改正?