Closed lilianjin closed 6 months ago
是签名格式的问题,本项目签名的参数缺省的是 asn1(r,s) ,你的例子里是 r. s的字符串拼接,使用之前先转换下, 在 src/util/SmSignFormatRS里有rs_to_asn1函数转换下,倒过来给对方的时候,也同步的asn1_to_rs (这个返回的是base64, 看对方要哪种的,看着是要hex 的,你转换一下)
你好,大哥!还是不对呢,对方的 sign 的位数是不变的。就是无论生成的什么内容。sign 长度是不变的。按你的建议我转换 (r, s) 签名还是不能匹配。你这边还方便指导下吗?
R+S的形式位数是不变的,前一半是R后一半是S,变了就不能正确裁开了,这个签名的确验证不过
require_once '../vendor/autoload.php';
use Rtgm\util\SmSignFormatRS;
use Rtgm\sm\RtSm2 as CryptSM2;
$privateKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$publicKey = 'fc436395c7acae80aa3d760dd85375ad0b5b467c4897c7cef99d3f0c76b3f4e616c73df6df4dede213bf16f8047f83a78ebe668bc87c6e4b7c783b9fa5df6f52';
// $sign = 'a940d1ae40f5438c87cce9acf2da090cc23f6c4daa11ae77ef802d6d09dc9d39752d06cef0368e403bfc7f772a2420506c2018e1215a0dee10428b8b24427307';
$sign = '3b0a4dfac9fdc877cbe9e1f428791d7fc354812f16b4590523610bd3d1cb7b33bb6b8f1bc8cf709ac5096a005077412623c94a96aa4e5036645c7d606ff9969d';
$demoText = '123';
//这里返回的base64
$nsign = SmSignFormatRS::rs_to_asn1($sign,'hex');
$realSign = bin2hex(base64_decode($nsign));
var_dump($realSign);
$sm = new CryptSM2('hex', false);
$result = $sm->verifySign($demoText, $realSign, $publicKey);
if($result){
echo "签名正确";
} else {
echo "签名错误";
}
的确是验证不过,那边就对方生成签名的参数与验证的不一致, 一般会可能出现这个问题: 1 不是一套密码,这个确认下是否一致 2 这边代码里验证签名用的是原始的数据 $demoText , 看下对方生成签名的时候用document字段是什么, 有些不用原始的比如做了md5之类的, 这个得确认 3 还有一个是userId 这个字段, 缺省是字符串'1234567812345678', 得确认下对方用的userId是什么
都确认了,理论 上不会有什么问题,与各个语言都测试过,会出问题一般都是格式或是输入时的参数(document, userId,key)不一致
辛苦了🌹!非常感谢大哥给的思路。方便给个码请大哥来个咖啡啥的。
不客气,共同学习进步
CODE
ERROR
求教大神指点