PHP DSA算法类及示例(签名由C#认证)

DSA数字签名算法:
p:一个素模数,其值满足: 2^(L-1) < p < 2^L,其中L是64的倍数,且满足 512 ≤ L ≤ 1024 。
q:(p-1) 的素因子,其值满足 2^159 < q < 2^160 。
g:g = powm(h, (p-1)/q, p) 。h为满足1< h < p - 1 的任意整数,从而有 powm(h, (p-1)/q, p) > 1 。
x:私钥。 x为一个随机或伪随机生成的整数,其值满足 0 < x < q 。
y:公钥。 y = powm(g, x, p) 。

签名产生过程如下: 1、产生一个随机数k,其值满足0< k < q 。
2、计算 r := powm(g, k, p) mod q ,其值满足 r >0 。
3、计算 s := ( k^(-1) ( SHA(M) + x*r) ) mod q ,其值满足 s >0 。

类文件下载

<?php  
require ('lib/BigInteger.php');  
require ('lib/Random.php');  
require ('lib/Hash.php');  
require ('lib/DSA.php');

//c#私钥
$DSAKeyValue = "<DSAKeyValue><P>5PP8kijoMwV7yKMIKmPk...S29iU2oDzsT4Fw4QyDZ9+n3JDSc4UfKk=</P><Q>gVIF83njNkx...ZcK0=</Q><G>vYeOcmiHqorLF3HEp.....nUoyGwg=</G><Y>WO3SMbVSw...Yr3i70QpuVY=</Y><J>AAAAAc...fEztpuzzQk9uj1/1918SA==</J><Seed>XYq02XiHa...MP1hgadg=</Seed><PgenCounter>Aic=</PgenCounter><X>ZVG0K...j0Am8HJGw6U=</X></DSAKeyValue>";

$p = bin2hex(base64_decode($key['P'][0]));
$q = bin2hex(base64_decode($key['Q'][0]));
$g = bin2hex(base64_decode($key['G'][0]));
$x = bin2hex(base64_decode($key['X'][0]));

$p = new Math_BigInteger($p, 16);
$q = new Math_BigInteger($q, 16);
$g = new Math_BigInteger($g, 16);
$x = new Math_BigInteger($x, 16);

$params = array(
    'xm' => '张XX',
    'sfx' => '510322197203013XXX',
);

$message = strtoupper(md5(join('', $params)));

$DSA_SIGN = new Crypt_DSA();

$detail = $DSA_SIGN::sign($message, 'sha1', $p, $q, $g, $x);  //$message, $hash_alg, $p, $q, $g, $x   生成数字签名

echo "数字签名:" . $detail . "\r\n";  

类中DSA.php 105行为C#的验证生成,如用php做签名验证,需要做相应修改:

return strtoupper($signature); //生成80位签名,c#,需要转大写

//如用php验证       
 /*return array(
            "r" => $r,
            "s" => $s
        );*/