Due to project needs, we need to interface with an insurance company to call API. Our company is a PHP backend, and the insurance company is a java backend. The data transmission in the middle must be encrypted and encrypted. Decrypted, the currently popular encryption AES is recommended.
In the process of docking, it is inevitable to go through mountains and rivers.
The following is the encryption description of my docking company:
You must be clear about your own encryption method, otherwise the difference between an encryption mode ECB and CBC will lead to hugely different results.
Attached is the final code that can be used:
<?php class Security { public static function encrypt($input, $key) { $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $input = Security::pkcs5_pad($input, $size); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } private static function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function decrypt($sStr, $sKey) { $decrypted= mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $sKey, base64_decode($sStr), MCRYPT_MODE_ECB ); $dec_s = strlen($decrypted); $padding = ord($decrypted[$dec_s-1]); $decrypted = substr($decrypted, 0, -$padding); return $decrypted; } } // $key = "1234567891234567"; // $data = "example"; // $value = Security::encrypt($data , $key ); // echo "加密::".$value.'<br/>'; // echo Security::decrypt($value, $key );
Public Called in function :
/** * request body加密 * @param array $content 投保人的信息 * @return string */ function hetai_encrypt($content) { // 方案七 print_r("\r\n"); vendor('encrypt.Security') or die("方案7引入失败"); $sec = new \Security(); $string = $content; $sec_res = $sec->encrypt($string, base64_decode("eeSvvVtUDLi5lTBHDjCeFw==")); $sec_res = strToHex($sec_res);// 结果转16进制并转成大写 // 这里做了好几次的转换 // 只是为了迎合出来我需要的结果而已 // 根据自己的加密要求来定 $encrypt_upper = strToHex(base64_decode(hexToStr($sec_res))); var_dump("\r\n方案7加密的结果\r\n" . $encrypt_upper); // 解密 $sec_res_lower = strtolower($sec_res);// 转小写 $sec_res_lower_tostr = hexToStr($sec_res);// 16进制转成string $sec_dec = $sec->decrypt($sec_res_lower_tostr, base64_decode("eeSvvVtUDLi5lTBHDjCeFw==")); var_dump("\r\n方案7解密的结果\r\n" . $sec_dec); return $encrypt_upper; }
Binary String Convert to 16 Convert hexadecimal string to binary:
/** * 字符串转十六进制 * @param string $string * @return string */ function strToHex($string) { $hex=""; for($i=0;$i<strlen($string);$i++) $hex.=dechex(ord($string[$i])); $hex=strtoupper($hex); return $hex; } /** * 十六进制转字符串 * 16进制的转为2进制字符串 * @param 十六进制 $hex * @return string */ function hexToStr($hex) { $string=""; for($i=0;$i<strlen($hex)-1;$i+=2) $string.=chr(hexdec($hex[$i].$hex[$i+1])); return $string; }
Attached is the encryption function block that tortured me for three days. It is only for my own reminder. If you don’t like it, please don’t comment~
The above is the detailed content of Sample code for PHP to interface with Java's AES/ECB/PKCS5Padding encryption method (picture). For more information, please follow other related articles on the PHP Chinese website!