公司今日接到一个需求,要与银行方面进行对接,接收银行方面 推送过来的加密信息,解密后入库进行统计,由于银行方是JAVA环境,我司是PHP环境,所以需要写一个PHP的解密方法,查阅各种文档后还是无法满足需求,无法进行解密,特来求助.
银行方只有一个加密流程文档:
加密方式:AES/ECB/PKCS5Padding
1、将data中的字段转成json格式如下:
{"userId":"12345678911111233","state":"2","cardNo":"625966","time":"20171212","extInfo":""}
2、URLEncode对josn字符串进行编码UTF-8防止中文乱码
URLEncoder.encode(data, "UTF-8")
%7B%22userId%22%3A%2212345678911111233%22%2C%22state%22%3A%222%22%2C%22cardNo%22%3A%22625966%22%2C%22time%22%3A%2220171212%22%2C%22extInfo%22%3A%22%22%7D
3、使用aesKey对URLEncode后的字符串进行AES加密, 得到data:
aesKey=Spdbccc-testtest
XBD5nXa7oAnsWo/l843zUfmuhpmWGKEieJoJXxZEHPun1zfQhEPBFKv5kXZMM8i2Vr9RJwZeW/zn6OScGSlRTNVaytu2M5CDABw6B1grqxCqjTu/fKTp3hpMJd0riMB7H7ZK5xGUBu2nGgacjPmVcVl8Xm34fdArx17DkHbHqOWgiwmesk0C/lgKK7hkyuiuVtEQPmc02Ipjx3JGyJ+59g==
我这边先是按照查询的文档中所说直接使用PHP自带的mcrypt扩展进行解密,发现php7.2已经弃用该扩展,换成openssl方式使用AES-128-ECB进行解密返回值是false;后来我转变思路,先用openssl以AES-128-ECB模式对第二步的串进行加密,获取到的结果和步骤三中的完全不一样,我改用先获取openssl的加密模式列表然后循环加密,输出各个加密方式的结果,发现没有一个能对上,到此以我的水平已经不知道该如何进行下一步了,特来求助!
可以试试下面这种AES加密解密方式看行不行
class AES {
/**
*
* @param string $string 需要加密的字符串
* @param string $key 密钥
* @return string
*/
public static function encrypt($string, $key)
{
// openssl_encrypt 加密不同Mcrypt,对秘钥长度要求,超出16加密结果不变
$data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
$data = strtolower(bin2hex($data));
return $data;
}
/**
* @param string $string 需要解密的字符串
* @param string $key 密钥
* @return string
*/
public static function decrypt($string, $key)
{
$decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
return $decrypted;
}
}
$sk = '0123456789abcdef';
$str = '测试字符串123abc';
$strEn = Aes::encrypt($str, $sk);//加密
echo '<meta charset="UTF-8">';
echo '加密后=' , $strEn , '<br>';
$strDe = Aes::decrypt($strEn, $sk);//解密
echo '解密后=' , $strDe , '<br>';
他们可能使用的是对称加密,用的是二进制,你这个的问他们的技术 如何实现的,看一下Java的代码