对接JAVA, 人家用的是DSA签名, 我先是百度, DSA签名, 信息真的是贼少, 少到了极点, 真的是贼少, 我搞了可久, 害, 走了弯路
一开始用的是phpseclib3的 DSA, 可是他们的DSA签名是自己直接生成了一个密钥对, 人家JAVA给我的有一个密钥了, 不行, 我就开始查非对称加密, 根据自己查到的东西(其实啥也没查到), 去找phpseclib里面的代码, 看看有没有load privateKey的方法, 找了一大圈, 自己照着上面疑似加载的代码写写, 还是不行, 和人家JAVA的对不上, 就放弃了这个, 到最后, 终于找到了, 我先截图, 后上代码, 嘿嘿嘿
这就是代码截图了, 秘钥是人家JAVA给我的, 自己可以先行百度一波 openssl_sign(), 下面上代码,
<?php
$data = 'woaiguohui666';
$res = getPrivateKey($privateKey);
if(!$res)
{
echo '私钥无效';exit;
}
$sign = '';
$aa = openssl_sign($data, $sign, $res, OPENSSL_ALGO_DSS1); // openssl_sign 默认是OPENSSL_ALGO_SHA1, 但是咱们是DSA签名, 用这个OPENSSL_ALGO_DSS1, 主要还是看JAVA那边是什么签名, 对应的就行了
var_dump($aa);
echo '<br/>';
echo '加密: '.base64_encode($sign);
echo '<br/>';
$res2 = getPublicKey($publicKey);
if($rse2)
{
echo '公钥无效';exit;
}
$res3 = openssl_verify($data, $sign, $res2, OPENSSL_ALGO_DSS1);
var_dump($res3);
echo '<br/>';
echo '解密: '.$data;
/**
* 获取私钥,如是私钥可用,则返回资源对象,不合法返回false
* @param string $strPrivateKey 密钥字符串
* @return resource 资源对象
*/
function getPrivateKey($strPrivateKey){
$pem = "-----BEGIN RSA PRIVATE KEY-----\n".
wordwrap($strPrivateKey, 64, "\n", true).
"\n-----END RSA PRIVATE KEY-----";
$privateKey = openssl_pkey_get_private($pem);
return $privateKey;
}
function getPublicKey($strPublicKey){
$pem = "-----BEGIN PUBLIC KEY-----\n".
wordwrap($strPublicKey, 64, "\n", true).
"\n-----END PUBLIC KEY-----";
$publicKey = openssl_pkey_get_public($pem);
return $publicKey;
}
这上面的就是代码了, 公钥和私钥我就不发了, 毕竟是人家JAVA给我的, 露出来不咋好, 如果有需要的话直接私我, 我天天都登陆CSDN, 最多一天我就会回, 亲测可用, 下面就是结果, 我自己运行的结果
搞了一天多, 真累啊, 不过还好都出来了, 哈哈哈
小李大人
爱生活爱慧姐
2021-5-20 17:43:27