Skip to content

Instantly share code, notes, and snippets.

@jk2K
Last active August 29, 2015 14:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jk2K/10d77527293e190d4ece to your computer and use it in GitHub Desktop.
Save jk2K/10d77527293e190d4ece to your computer and use it in GitHub Desktop.
chinapay向上兼容php5.5
<?php
define("DES_KEY", "SCUBEPGW");
define("HASH_PAD", "0001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a05000414");
bcscale(0);
$private_key = array();
if (!function_exists('hex2bin'))
{
function hex2bin($hexdata)
{
$bindata = '';
if (strlen($hexdata) % 2 == 1)
{
$hexdata = '0' . $hexdata;
}
for ($i = 0; $i < strlen($hexdata); $i += 2)
{
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}
}
function padstr($src, $len = 256, $chr = '0', $d = 'L')
{
$ret = trim($src);
$padlen = $len - strlen($ret);
if ($padlen > 0)
{
$pad = str_repeat($chr, $padlen);
if (strtoupper($d) == 'L')
{
$ret = $pad . $ret;
}
else
{
$ret = $ret . $pad;
}
}
return $ret;
}
function bin2int($bindata)
{
$hexdata = bin2hex($bindata);
return bchexdec($hexdata);
}
function bchexdec($hexdata)
{
$ret = '0';
$len = strlen($hexdata);
for ($i = 0; $i < $len; $i++)
{
$hex = substr($hexdata, $i, 1);
$dec = hexdec($hex);
$exp = $len - $i - 1;
$pow = bcpow('16', $exp);
$tmp = bcmul($dec, $pow);
$ret = bcadd($ret, $tmp);
}
return $ret;
}
function bcdechex($decdata)
{
$s = $decdata;
$ret = '';
while ($s != '0')
{
$m = bcmod($s, '16');
$s = bcdiv($s, '16');
$hex = dechex($m);
$ret = $hex . $ret;
}
return $ret;
}
function sha1_128($string)
{
$hash = sha1($string);
$sha_bin = hex2bin($hash);
$sha_pad = hex2bin(HASH_PAD);
return $sha_pad . $sha_bin;
}
function mybcpowmod($num, $pow, $mod)
{
if (function_exists('bcpowmod'))
{
return bcpowmod($num, $pow, $mod);
}
return emubcpowmod($num, $pow, $mod);
}
function emubcpowmod($num, $pow, $mod)
{
$result = '1';
do
{
if (!bccomp(bcmod($pow, '2'), '1'))
{
$result = bcmod(bcmul($result, $num), $mod);
}
$num = bcmod(bcpow($num, '2'), $mod);
$pow = bcdiv($pow, '2');
}
while (bccomp($pow, '0'));
return $result;
}
function rsa_encrypt($private_key, $input)
{
$p = bin2int($private_key["prime1"]);
$q = bin2int($private_key["prime2"]);
$u = bin2int($private_key["coefficient"]);
$dP = bin2int($private_key["prime_exponent1"]);
$dQ = bin2int($private_key["prime_exponent2"]);
$c = bin2int($input);
$cp = bcmod($c, $p);
$cq = bcmod($c, $q);
$a = mybcpowmod($cp, $dP, $p);
$b = mybcpowmod($cq, $dQ, $q);
if (bccomp($a, $b) >= 0)
{
$result = bcsub($a, $b);
}
else
{
$result = bcsub($b, $a);
$result = bcsub($p, $result);
}
$result = bcmod($result, $p);
$result = bcmul($result, $u);
$result = bcmod($result, $p);
$result = bcmul($result, $q);
$result = bcadd($result, $b);
$ret = bcdechex($result);
$ret = strtoupper(padstr($ret));
return (strlen($ret) == 256) ? $ret : false;
}
function rsa_decrypt($input)
{
global $private_key;
$check = bchexdec($input);
$modulus = bin2int($private_key["modulus"]);
$exponent = bchexdec("010001");
$result = bcpowmod($check, $exponent, $modulus);
$rb = bcdechex($result);
return strtoupper(padstr($rb));
}
function buildKey($key)
{
global $private_key;
if (count($private_key) > 0)
{
foreach ($private_key as $name => $value)
{
unset($private_key[$name]);
}
}
$ret = false;
$key_file = parse_ini_file($key);
if (!$key_file)
{
return $ret;
}
if (array_key_exists("MERID", $key_file))
{
$ret = $key_file["MERID"];
$private_key["MERID"] = $ret;
$hex = substr($key_file["prikeyS"], 80);
$bin = hex2bin($hex);
$private_key["modulus"] = substr($bin, 0, 128);
$iv = str_repeat("\x00", 8);
$td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, DES_KEY, $iv);
$private_key["prime1"] = mdecrypt_generic($td, substr($bin, 384, 64));
mcrypt_generic_init($td, DES_KEY, $iv);
$private_key["prime2"] = mdecrypt_generic($td, substr($bin, 448, 64));
mcrypt_generic_init($td, DES_KEY, $iv);
$private_key["prime_exponent1"] = mdecrypt_generic($td, substr($bin, 512, 64));
mcrypt_generic_init($td, DES_KEY, $iv);
$private_key["prime_exponent2"] = mdecrypt_generic($td, substr($bin, 576, 64));
mcrypt_generic_init($td, DES_KEY, $iv);
$private_key["coefficient"] = mdecrypt_generic($td, substr($bin, 640, 64));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
elseif (array_key_exists("PGID", $key_file))
{
$ret = $key_file["PGID"];
$private_key["PGID"] = $ret;
$hex = substr($key_file["pubkeyS"], 48);
$bin = hex2bin($hex);
$private_key["modulus"] = substr($bin, 0, 128);
}
return $ret;
}
function sign($msg)
{
global $private_key;
if (!array_key_exists("MERID", $private_key))
{
return false;
}
$hb = sha1_128($msg);
return rsa_encrypt($private_key, $hb);
}
function verify($plain, $check)
{
global $private_key;
if (!array_key_exists("PGID", $private_key))
{
return false;
}
if (strlen($check) != 256)
{
return false;
}
$hb = sha1_128($plain);
$hbhex = strtoupper(bin2hex($hb));
$rbhex = rsa_decrypt($check);
return $hbhex == $rbhex ? true : false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment