内容来自 https://www.xiegaosheng.com/post/view?id=32
a)采用标准的CBC模式的DES加密算法;
b)密钥长度为56位,唯一密钥;
c)数据采用初始向量(VI)做互斥运算,VI唯一初始向量;
d)所有协议数据的明文需要在尾部加上原始数据长度,再加上“ABCD”4个字母,然后按64位进行分组,不足64位的以“\0”补足,分组后的明文采用统一的加密方式生成密文,即采用 “明文+密钥+初始化向量(VI)”。
e) 加密结果先base64_encode 然后urlencode加密
<?php
header("Content-type:text/html;charset=utf-8");
//加密
function encrypt($str , $key , $iv) {
return @mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_ENCRYPT, $iv );
}
//解密
function decrypt($strBin , $key = '12345678',$iv = '12345678'){
$strBin = base64_decode(urldecode($strBin));//解密的时候要先urldecode 在base64和加密相反
return @mcrypt_cbc( MCRYPT_DES, $key, $strBin, MCRYPT_DECRYPT, $iv );
}
//发送http 请求
function postUrl($url , $data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$handles = curl_exec($ch);
curl_close($ch);
return $handles;
}
//这是在尾部添加的数据;如果有错误的话会使解密的数据和加密的数据开头有乱码
function getnbytes($data,$key = '12345678',$iv = '12345678'){
$len = mb_strlen($data);
$data = $data.$len."ABCD";
//不够补0
$mod = 8-$len%8;
//return $mod;
for ($i=0; $i < $mod; $i++) {
# code...
$data.="\0";
}
// return $data;
$data = encrypt($data , $key , $iv);
return urlencode(base64_encode($data));
}
php版本是7.0的话需要改
//加密
function encrypt($str , $key , $iv) {
return @mcrypt_encrypt(MCRYPT_DES, $key, $str, 'cbc', $iv );
}
//解密
function decrypt($strBin , $key = '12345678',$iv = '12345678'){
$strBin = base64_decode(urldecode($strBin));//解密的时候要先urldecode 在base64和加密相反
return @mcrypt_decrypt( MCRYPT_DES, $key, $strBin, 'cbc', $iv );
}
之前还遇到一个需求是要int大端字节
a)所有协议数据的明文需要在尾部加上原始数据长度(int大端字节数4字节,协议数据的长度),再加上“ABCD”4个字母,然后按64位进行分组,不足64位的以“\0”补足,分组后的明文采用统一的加密方式生成密文,即采用 “明文+密钥+初始化向量(VI)”。
代码作出相应的更改