php Rc4对接java过程中遇见的坑

方法一:(传输十六进制)

直接将返回的二进制数据,转换成十六进制,然后发送给java

实例:

$post=array('app_key'=>'ce387668d26157','code'=>'a0b92382');

$key='123456';

$data=_rc4($key,json_encode($post));

$data=bin2hex($data);/*二进制转换为十六进制*/

echo$data;/*传送给java*/

function _rc4($pwd, $data){
    $key[] = "";
    $box[] = "";
    $pwd_length = strlen($pwd);
    $data_length = strlen($data);
    for ($i = 0; $i < 256; $i++) {
        $key[$i] = ord($pwd[$i % $pwd_length]);
        $box[$i] = $i;
    }

    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $key[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

    $cipher = '';
    for ($a = $j = $i = 0; $i < $data_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $k = $box[($box[$a] + ($box[$j]%256)) % 256];

        $cipher .= chr(ord($data[$i]) ^ $k);
    }

    return $cipher;
}

方法二、(传输二进制)

1、汉字在php中换算成字节后跟java对不上的,按照规律在Rc4方法中加入了这么一行代码

$byte = (ord($data[$i]) >= 128)?(ord($data[$i]) - 256):ord($data[$i]);

2、对内容进行编码,可使用的编码方式 unicode 、urlencode...等

3、写流的时候 使用UTF-8编码 (实现不了可以使用utf8_encode,当然接收的时候就也需要加上utf8_decode)

实例:这里使用的是unicode

$post = array ('app_key'=>'ce387668d26157', 'code' => 'a0b92382');
$key = '123456';
$json =json_encode($post,JSON_UNESCAPED_UNICODE);
$data = enRc4($key,unicode_encode($json));
echo utf8_encode($data);/*传送给java*/
function enRc4($key,$data){
    $vactor[]='';
    $tempK[]='';
    $k_len = strlen($key);
    $data_len = strlen($data);
    for ($i = 0; $i < 256; $i++) {
        $tempK[$i] = ord($key[$i % $k_len]);
        $vactor[$i] = $i;
    }
    for($j=$i=0;$i<256;$i++){
        $j = ($j+$vactor[$i]+$tempK[$i])%256;
        $temp = $vactor[$i];
        $vactor[$i] =$vactor[$j];
        $vactor[$j] = $temp;
    }
    $cipher = '';
    for ($i = $j = $x = 0; $x < $data_len; $x++) {
        $i = ($i + 1) % 256;
        $j = ($j + $vactor[$i]) % 256;
        $tmp = $vactor[$i];
        $vactor[$i] = $vactor[$j];
        $vactor[$j] = $tmp;
        $k = $vactor[($vactor[$i] + ($vactor[$j]%256)) % 256];
        $byte = (ord($data[$x]) >= 128)?(ord($data[$x]) - 256):ord($data[$x]);
        $cipher .= chr($byte ^ $k);
    }
    return $cipher;
}
//将内容进行UNICODE编码,编码后的内容格式:\u56fe\u7247 (原始:图片)
function unicode_encode($name)
{
    $name = iconv('UTF-8', 'UCS-2', $name);
    $len  = strlen($name);
    $str  = '';
    for ($i = 0; $i < $len - 1; $i = $i + 2){
        $c  = $name[$i];
        $c2 = $name[$i + 1];
        if (ord($c) > 0){   //两个字节的文字
            $str .= '\u'.base_convert(ord($c), 10, 16).str_pad(base_convert(ord($c2), 10, 16), 2, 0, STR_PAD_LEFT);           
        } else {
            $str .= '\u'.str_pad(base_convert(ord($c2), 10, 16), 4, 0, STR_PAD_LEFT);          
        }
    }
    return $str;
}

猜你喜欢

转载自blog.csdn.net/lctmei/article/details/78320323