aesecbpkcs5 php_PHP对接java的AES/ECB/PKCS5Padding加密方式的示例代码(图)

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

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

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

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

附上最终能使用的代码:<?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.'
';

// 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

$hex.=dechex(ord($string[$i]));

$hex=strtoupper($hex);

return $hex;

}

/**

* 十六进制转字符串

* 16进制的转为2进制字符串

* @param 十六进制 $hex

* @return string

*/

function hexToStr($hex)

{

$string="";

for($i=0;$i

$string.=chr(hexdec($hex[$i].$hex[$i+1]));

return $string;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值