1.中电联的一些接口及加密标准
T/CEC 102.4-2016 电动汽车充换电服务信息交换 第4部分: 数据传输及安全
2.根据文档可以看出,加密/解密的方式以及一些规范

签名.png

加密.png

规范.png
正文:
!!!!!实际开发需要注意秘钥的使用!!!!!
1.其加密sig(签名)主要通过HMAC-MD5的方式实现,填充方式是PKCS5Padding
具体Php代码:
//转换字符编码为utf-8
public function strToUtf8($str){
$encode = mb_detect_encoding($str, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
if($encode == 'UTF-8'){
return $str;
}
else{
return mb_convert_encoding($str, 'UTF-8', $encode);
}
}
/**
* sig加密算法
* @param $data 加密数据
* @param $key 加密key
* @return string
*/
public function hmac($data, $key): string
{
$key = $this->strToUtf8($key);
$data = $this->strToUtf8($data);
$b = 64;
if (strlen($key) > $b) {
$key = pack("H32", md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad;
$k_opad = $key ^ $opad;
return strtoupper(md5($k_opad . pack("H32", md5($k_ipad . $data))));
}
2.数据返回加密/解密主要是通过AES-128-CBC实现
具体代码:
/**
* 加密
* @param $data
* @param $key
* @param $iv
* @return string
*/
public function encrypt($data,$key,$iv): string
{
$data = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_PKCS1_PADDING, $iv);
return base64_encode($data);
}
/**
* 解密
* @param $data
* @param $key
* @param $iv
* @return false|string
*/
public function decrypt($data,$key,$iv)
{
return openssl_decrypt(base64_decode($data), 'AES-128-CBC', $key, OPENSSL_PKCS1_PADDING, $iv);
}