php代码实现如下:
"+", "_" => "/"); return base64_decode(str_pad(strtr($data, $trans), strlen($data) % 4, '=', STR_PAD_RIGHT)); } function base64url_encode($data) { $trans = array("+" => "-", "/" => "_"); $ret = strtr(base64_encode($data), $trans); return $ret; } function decode_price($base64_text) { $s1 = $this->base64url_decode($base64_text); $iv = substr($s1, 0, 16); $p = substr($s1, 16, 8); $sig = substr($s1, 24, 4); $enc_key = $this->config->item('enc_key'); $pad = hash_hmac('sha1', $iv, hex2bin($enc_key)); $price = $this->xor_str($p, substr(hex2bin($pad), 0, 8), 8); $ret = array('price'=>hexdec($price), 'sig'=>$this->sig($price, $iv, $sig)); return $ret; } /** * @param $price 为十进制 * @param $iv 前8位带上时间戳 */ function encode_price($price, $iv) { if(strlen(''.$price)<16) { $price = sprintf('%016x', $price); } $pad = substr(hash_hmac('sha1', hex2bin($iv), hex2bin($this->config->item('enc_key'))), 0, 16); $enc_price = $this->xor_str(hex2bin($pad), hex2bin($price), 8); $sig = substr(hash_hmac('sha1', hex2bin($price.$iv), hex2bin($this->config->item('sig_key'))), 0, 8); $ret = $this->base64url_encode(hex2bin($iv.$enc_price.$sig)); for($i=0;$i<2;$i++) { if($ret[strlen($ret)-1]=='=') { $ret = substr($ret, 0, strlen($ret)-2); } } return $ret; } function sig($price, $iv, $sig) { $sig_key = $this->config->item('sig_key'); $sig1 = hex2bin(hash_hmac('sha1', hex2bin(sprintf('%016x', $price)).$iv, hex2bin($sig_key))); $len = strlen($sig); return substr($sig1, 0, $len)===substr($sig, 0, $len); } function xor_str($s1, $s2, $len) { $ret = ''; for($i=0;$i<$len;$i++) { $ret .= sprintf('%02x', ord($s1[$i])^ord($s2[$i])); } return $ret; } }