我不能肯定地说没有使用这两个库中的任何一个,但是一种可能性是它们没有为签名使用相同的编码类型。对于DSA / ECDSA,有两种主要格式,IEEEP1363(Windows使用)和DER(OpenSSL使用)。
“ Windows”格式应具有预设的大小(由DS的Q值和ECDSA的P值决定(Windows不支持Char-2,但如果是的话,Char-2ECDSA则可能为M))。然后将
r和
s都用左填充,
0直到它们达到该长度。
在太小是合法例如
r = 0x305和
s = 0x810522用的sizeof(Q)是3个字节:
// r000305// s810522
对于“ OpenSSL”格式,它按照DER规则编码为SEQUENCE(INTEGER(r),INTEGER(s)),看起来像
// SEQUENCE30 // (length of payload) 0A // INTEGER(r) 02 // (length of payload) 02 // note the leading 0x00 is omitted 0305 // INTEGER(s) 02 // (length of payload) 04 // Since INTEGER is a signed type, but this represented a positive number, // a 0x00 has to be inserted to keep the sign bit clear. 00810522
或者,紧凑地:
- Windows:
000305810522
- OpenSSL:
300A02020305020400810522
“ Windows”格式始终为偶数,且长度始终相同。“ OpenSSL”格式通常大约大6个字节,但是中间可能会增加或丢失一个字节;所以有时候甚至是奇怪
base64解码您的
sig64值表明它正在使用DER编码。使用WebCrypto生成几个签名;如果没有开始,
0x30那么您就有IEEE /DER问题。



