Closed branll closed 2 weeks ago
签名格式的问题, 国密签名会生成两个字段 r ,s ; PHP生成的是 标准的 base64_encode(asn1(r,s)), 你的这个java生成的是 base_encode(bin2hex(r+s)) 请自行解开, 在 util/SmSignFormatRS 中可以将asn1转出 r+s的,请自行按需求进行更新,格式转换
试了一下,验签通过,非常感谢
// SM3对签名体进行摘要计算
$signatureSm3 = (new RtSm3())->digest($plainText);
$sm2Lib = new RtSm2('base64', false);
// SM2算法使用私钥对摘要信息进行加密
$signatureASN1 = $sm2Lib->doSign($signatureSm3, $privateKey);
// 居然还要这么操作来转换格式
$smSignFormatRS = new \Rtgm\util\SmSignFormatRS();
// 转换为RS
$signatureRS = $smSignFormatRS->asn1_to_rs($signatureASN1);
$signature = base64_encode(bin2hex(base64_decode($signatureRS)));
// 对方 验签通过
// 我方 验证签名
$verifyRS = base64_decode($signature);
// 转换为ASN1
$verifyASN1 = $smSignFormatRS->rs_to_asn1($verifyRS, 'hex');
$verifyRes = $sm2Lib->verifySign($signatureSm3, $verifyASN1, $publicKey);
// 我方 验签通过
问题描述
开发环境: windows 测试环境密钥 将字符串,先sm3再sm2签名,调用java的接口,验签失败
麻烦给看看
php签名串示例
MEQCIAMsOvIyroeEEe+AY2GUjrJiI8jcAvTLhnyHFKq60BsqAiA57A7oMWDAVqGnHauno32/6fjAvkITtnGIwpaImNt3qQ==
java签名串示例
NzdiZTQ4NTI1YjBmZDJiMWQyYjk2MGY3MmU4YTRkMGU0ZDAzNDZjMGY4Mzk0NjQ3MmMyMmRhZGM5Y2U4NzgyNjY4Zjk3NmY2MTgwYjQ2NDc0ZGU3MDNlOGE2NjZiNWIzMmIxNDc2NGY3ZDBmOTEzNWUxYTUzNDQwZTAyN2IxZGM=