68 lines
2.6 KiB
JavaScript
68 lines
2.6 KiB
JavaScript
const sm2 = require('sm-crypto').sm2;
|
|
const sm3 = require('sm-crypto').sm3;
|
|
|
|
console.log('=== 调试 SM2 签名格式 ===');
|
|
|
|
// 生成测试数据
|
|
const testData = 'QDJNHHVB_FWQ';
|
|
const hash = sm3(testData);
|
|
console.log('测试数据:', testData);
|
|
console.log('SM3 哈希:', hash);
|
|
|
|
// 生成密钥对
|
|
const keypair = sm2.generateKeyPairHex();
|
|
console.log('\n生成的密钥对:');
|
|
console.log(' 私钥:', keypair.privateKey);
|
|
console.log(' 公钥:', keypair.publicKey);
|
|
|
|
// 生成签名
|
|
const sig = sm2.doSignature(hash, keypair.privateKey);
|
|
console.log('\nsm-crypto 生成的签名:', sig);
|
|
console.log('签名长度:', sig.length);
|
|
|
|
// 验证签名
|
|
const verifyResult = sm2.doVerifySignature(hash, sig, keypair.publicKey);
|
|
console.log('验证结果:', verifyResult);
|
|
|
|
// 对比用户提供的签名
|
|
const userSignature = '3044022002d3816303ee2a352477f3227070cc34297bd6e89dc86e2c54840fffc92c3b67022066114b6bfacb00408cc51b8c18d02023f50671844372094d9460bd5f85acac50';
|
|
console.log('\n用户提供的签名:', userSignature);
|
|
console.log('用户签名长度:', userSignature.length);
|
|
|
|
// 分析签名格式
|
|
console.log('\n签名格式分析:');
|
|
console.log('sm-crypto 签名格式:', sig.length === 128 ? '原始 r|s 格式' : '其他格式');
|
|
console.log('用户签名格式:', userSignature.startsWith('30') ? 'ASN.1 DER 格式' : '其他格式');
|
|
|
|
// 尝试转换用户签名格式
|
|
if (userSignature.startsWith('30')) {
|
|
console.log('\n尝试将 ASN.1 DER 格式转换为原始格式:');
|
|
try {
|
|
// 解析 ASN.1 DER 格式
|
|
// 格式: 30 len 02 len r 02 len s
|
|
const rStart = 6; // 30 44 02 20
|
|
const rLen = parseInt(userSignature.substring(4, 6), 16) * 2;
|
|
const r = userSignature.substring(rStart, rStart + rLen);
|
|
|
|
const sStart = rStart + rLen + 4; // 02 20
|
|
const sLen = parseInt(userSignature.substring(rStart + rLen + 2, rStart + rLen + 4), 16) * 2;
|
|
const s = userSignature.substring(sStart, sStart + sLen);
|
|
|
|
console.log(' 提取的 r:', r);
|
|
console.log(' 提取的 s:', s);
|
|
|
|
// 组合成原始格式
|
|
const rawSignature = r + s;
|
|
console.log(' 转换后的原始格式:', rawSignature);
|
|
console.log(' 原始格式长度:', rawSignature.length);
|
|
|
|
// 尝试验证
|
|
const userPublicKey = '04bb7754e559f6d158d52fdc4608244f07f12901363a1d6db8fb3219bf8e827efd11d8f18cf9926cfdd61aaf0eea2429e921b7b94f43ca9b2c89213355ad59e731';
|
|
const result = sm2.doVerifySignature(hash, rawSignature, userPublicKey);
|
|
console.log(' 验证结果:', result);
|
|
|
|
} catch (e) {
|
|
console.error(' 转换错误:', e.message);
|
|
}
|
|
}
|