const sm2 = require('sm-crypto').sm2; const sm3 = require('sm-crypto').sm3; console.log('=== 验证用户提供的 SM2 数据 ==='); // 用户提供的数据 const dataHex = '51444A4E484856425F465751'; const signatureHex = '02D3816303EE2A352477F3227070CC34297BD6E89DC86E2C54840FFFC92C3B6766114B6BFA CB00408CC51B8C18D02023F50671844372094D9460BD5F85ACAC50'.replace(/\s/g, ''); const userId = '1234567812345678'; const hashHex = '0F76D50E476E24507187885DF1BC197B48F368F3C03DDF0A5C0C067D2EEF63EE'; // 从用户的 PKCS7 签名中提取的公钥 const publicKeyHex = '04bb7754e559f6d158d52fdc4608244f07f12901363a1d6db8fb3219bf8e827efd11d8f18cf9926cfdd61aaf0eea2429e921b7b94f43ca9b2c89213355ad59e731'; // 转换数据 const data = Buffer.from(dataHex, 'hex').toString('utf8'); console.log('数据:', data); console.log('数据长度:', data.length); console.log('签名长度:', signatureHex.length / 2, '字节'); // 去掉公钥的 04 前缀 const pubKeyWithoutPrefix = publicKeyHex.substring(2); console.log('公钥(去掉前缀):', pubKeyWithoutPrefix); // 测试不同的验证选项 console.log('\n测试不同的验证选项:'); // 尝试 1: 使用哈希 + userId console.log('\n1. 使用哈希 + userId:'); try { const result1 = sm2.doVerifySignature(hashHex, signatureHex, pubKeyWithoutPrefix, { hash: true, userId }); console.log(' 验证结果:', result1); } catch (e) { console.error(' 错误:', e.message); } // 尝试 2: 使用原始数据 + userId console.log('\n2. 使用原始数据 + userId:'); try { const result2 = sm2.doVerifySignature(data, signatureHex, pubKeyWithoutPrefix, { hash: true, userId }); console.log(' 验证结果:', result2); } catch (e) { console.error(' 错误:', e.message); } // 尝试 3: 使用原始数据 + userId + 公钥 console.log('\n3. 使用原始数据 + userId + 公钥:'); try { const result3 = sm2.doVerifySignature(data, signatureHex, pubKeyWithoutPrefix, { hash: true, userId, publicKey: pubKeyWithoutPrefix }); console.log(' 验证结果:', result3); } catch (e) { console.error(' 错误:', e.message); } // 尝试 4: 直接使用原始数据 console.log('\n4. 直接使用原始数据:'); try { const result4 = sm2.doVerifySignature(data, signatureHex, pubKeyWithoutPrefix); console.log(' 验证结果:', result4); } catch (e) { console.error(' 错误:', e.message); } // 尝试 5: 使用 DER 格式 console.log('\n5. 使用 DER 格式:'); try { const result5 = sm2.doVerifySignature(data, signatureHex, pubKeyWithoutPrefix, { der: true }); console.log(' 验证结果:', result5); } catch (e) { console.error(' 错误:', e.message); } // 尝试 6: 使用 DER + 哈希 + userId console.log('\n6. 使用 DER + 哈希 + userId:'); try { const result6 = sm2.doVerifySignature(data, signatureHex, pubKeyWithoutPrefix, { der: true, hash: true, userId }); console.log(' 验证结果:', result6); } catch (e) { console.error(' 错误:', e.message); }