> 24 & 0xff);
$byt [1] = ($val >> 16 & 0xff);
$byt [2] = ($val >> 8 & 0xff);
$byt [3] = ($val & 0xff);
return $byt;
}
/**
* 将元数据进行补位后进行3DES加密
*
* 补位后 byte[] = 描述有效数据长度(int)的byte[]+原始数据byte[]+补位byte[]
*
* @param
* sourceData 元数据字符串
* @return 返回3DES加密后的16进制表示的字符串
*/
public static function encrypt2HexStr($keys, $sourceData) {
$source = [];
// 元数据
$source = self::getBytes($sourceData);
// 1.原数据byte长度
$merchantData = count($source);
// 2.计算补位
$x = ($merchantData + 4) % 8;
$y = ($x == 0) ? 0 : (8 - $x);
// echo ("需要补位 :" . $y . "
");
// 3.将有效数据长度byte[]添加到原始byte数组的头部
$sizeByte = self::integerToBytes($merchantData);
$resultByte = array ();
for($i = 0; $i < 4; $i ++) {
$resultByte [$i] = $sizeByte [$i];
}
//var_dump($sizeByte);
// 4.填充补位数据
for($j = 0; $j < $merchantData; $j ++) {
$resultByte [4 + $j] = $source [$j];
}
//var_dump($resultByte);
for($k = 0; $k < $y; $k ++) {
$resultByte [$merchantData + 4 + $k] = 0x00;
}
$desdata = self::encrypt (self::toStr($resultByte), $keys);
return self::strToHex($desdata);
}
/**
* 转换一个16进制hexString字符串为十进制byte数组
*
* @param $hexString 需要转换的十六进制字符串
* @return 一个byte数组
*
*/
private static function hexStrToBytes($hexString) {
$bytes = array ();
for($i = 0; $i < strlen ( $hexString ) - 1; $i += 2) {
$bytes [$i / 2] = hexdec ( $hexString [$i] . $hexString [$i + 1] ) & 0xff;
}
return $bytes;
}
public static function decrypt4HexStr($keys, $data) {
$hexSourceData = [];
$hexSourceData = self::hexStrToBytes($data);
// 解密
$unDesResult = self::decrypt(self::toStr($hexSourceData),$keys);
//echo $unDesResult;
$unDesResultByte = self::getBytes($unDesResult);
//var_dump($unDesResultByte);
$dataSizeByte = array ();
for($i = 0; $i < 4; $i ++) {
$dataSizeByte [$i] = $unDesResultByte [$i];
}
// 有效数据长度
$dsb = self::byteArrayToInt($dataSizeByte, 0);
$tempData = array ();
for($j = 0; $j < $dsb; $j++) {
$tempData [$j] = $unDesResultByte [4 + $j];
}
return self::hexTobin(self::bytesToHex($tempData));
}
// 字符串转16进制
private static function bytesToHex($bytes) {
$str = self::toStr( $bytes );
return self::strToHex ( $str );
}
/**
* @param unknown $hexstr
* @return Ambigous
*/
private static function hexTobin($hexstr)
{
$n = strlen($hexstr);
$sbin="";
$i=0;
while($i<$n)
{
$a =substr($hexstr,$i,2);
$c = pack("H*",$a);
if ($i==0){$sbin=$c;}
else {$sbin.=$c;}
$i+=2;
}
return $sbin;
}
/**
* 将byte数组 转换为int
* @param b
* @param offset 位游方式
* @return
*/
private static function byteArrayToInt($b, $offset) {
$value = 0;
for($i = 0; $i < 4; $i ++) {
$shift = (4 - 1 - $i) * 8;
$value = $value + ($b [$i + $offset] & 0x000000FF) << $shift; // 往高位游
}
return $value;
}
/**
* 将十进制字符串转换为十六进制字符串
*
* @param $string 需要转换字符串
* @return 一个十六进制字符串
*/
private static function strToHex($string) {
$hex = "";
for($i = 0; $i < strlen ( $string ); $i ++) {
$tmp = dechex ( ord ( $string [$i] ) );
if (strlen ( $tmp ) == 1) {
$hex .= "0";
}
$hex .= $tmp;
}
$hex = strtolower ( $hex );
return $hex;
}
/**
* 将字节数组转化为String类型的数据
* @param $bytes 字节数组
* @param $str 目标字符串
*
* @return 一个String类型的数据
*/
private static function toStr($bytes) {
$str = '';
foreach ( $bytes as $ch ) {
$str .= chr ( $ch );
}
return $str;
}
// 加密算法
private static function encrypt($input, $key) {
$size = mcrypt_get_block_size ('des', 'ecb');
$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '');
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
// 使用MCRYPT_3DES算法,cbc模式
@mcrypt_generic_init ( $td, $key, $iv );
// 初始处理
$data = mcrypt_generic ( $td, $input );
// 加密
mcrypt_generic_deinit ( $td );
// 结束
mcrypt_module_close ( $td );
return $data;
}
private static function decrypt($encrypted, $key) {
//$encrypted = base64_decode($encrypted);
$td = mcrypt_module_open ( MCRYPT_3DES, '', 'ecb', '' ); // 使用MCRYPT_DES算法,cbc模式
$iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND );
$ks = mcrypt_enc_get_key_size ( $td );
@mcrypt_generic_init ( $td, $key, $iv ); // 初始处理
$decrypted = mdecrypt_generic ( $td, $encrypted ); // 解密
mcrypt_generic_deinit ( $td ); // 结束
mcrypt_module_close ( $td );
return $decrypted;
}
/**
* 京东的证书请求
* @param type $cacert 证书目录
* @param type $url 请求地址
* @param type $dataString
* @return type
*/
public static function httpPostData($cacert,$url,$dataString) {
//$cacert = ''; //CA根证书 (目前暂不提供)
$CA = false ; //HTTPS时是否进行严格认证
$TIMEOUT = 30; //超时时间(秒)
$SSL = substr($url, 0, 8) == "https://" ? true : false;
$ch = curl_init ();
if ($SSL && $CA) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);//只信任CA颁布的证书
curl_setopt($ch, CURLOPT_CAINFO, $cacert); //CA根证书(用来验证的网站证书是否是CA颁布)
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //检查证书中是否设置域名,并且是否与提供的主机名匹配
} else if ($SSL && !$CA) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //信任任何证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); //检查证书中是否设置域名
}
curl_setopt ( $ch, CURLOPT_TIMEOUT, $TIMEOUT);
curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT, $TIMEOUT-2);
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $dataString);
curl_setopt ( $ch, CURLOPT_HTTPHEADER, [
'Content-Type:application/xml;charset=utf-8',
'Content-Length:' . strlen($dataString)
]);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo ($ch, CURLINFO_HTTP_CODE);
return array (
$return_code,
$return_content
);
}
}