小兔网

因项目需要,要和一家保险公司对接调用API,我公司是PHP后台,保险公司是java后台,中间的数据传输就避免不了要加密、解密了,目前通行的加密AES比较推荐。

对接的过程中,就难免要翻山越水的了,

下面是我对接公司的加密说明:

2021062106393619655580

一定要屡清楚自己的加密方式,否则一个加密模式ECB、CBC的差别,结果就千差万别的。

附上最终能使用的代码:

<?phpclass 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 );

公共函数中调用:

/**     * 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;             }

二进制字符串转16进制、16进制字符串转二进制:

/**     * 字符串转十六进制     * @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;    }

附上折磨我三天的加密功能块,仅供自己作提醒之用,不喜勿喷~

2021062106393814412861

以上就是PHP对接java的AES/ECB/PKCS5Padding加密方式的示例代码(图)的知识。速戳>>知识兔学习精品课!