验签
M为明文,(r,s)为签名结果,用户公钥P
实现步骤:
e=hash(M)
t=(r+s) mod n
(x,y)=[s]G + [t]P
R=(e+x)mod n
计算R==?r
签名者用户A的密钥对包括其私钥dA和公钥PA=[dA]G= (xA,yA)
l 签名者用户A具有长度为entlenA比特的可辨别标识IDA,
l ENTLA是由整数entlenA转换而成的两个字节
l ZA=SM3(ENTLA || IDA || a || b || xG || yG|| xA || yA)。
l 消息为M,数字签名(r,s)
用国密局的自签名SM2证书来示范
MIICaDCCAgygAwIBAgIJAK8ocl2Y0zFDMAwGCCqBHM9VAYN1BQAwfTELMAkGA1UEBgwCY24xCz
AJBgNVBAgMAmJqMQswCQYDVQQHDAJiajEPMA0GA1UECgwGdG9wc2VjMQ8wDQYDVQQLDAZ0b
3BzZWMxETAPBgNVBAMMCFRvcHNlY0NBMR8wHQYJKoZIhvcNAQkBDBBiakB0b3BzZWMuY29tLm
NuMB4XDTEyMDYyNDA3NTQzOVoXDTMyMDYyMDA3NTQzOVowfTELMAkGA1UEBgwCY24xCzAJB
gNVBAgMAmJqMQswCQYDVQQHDAJiajEPMA0GA1UECgwGdG9wc2VjMQ8wDQYDVQQLDAZ0b3Bz
ZWMxETAPBgNVBAMMCFRvcHNlY0NBMR8wHQYJKoZIhvcNAQkBDBBiakB0b3BzZWMuY29tLmNuM
FkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1pwvHuw7+2uVswwoCFx3sSXXepw5Ul2BkHaPN9ayB
bWJ3NMWu+fYmp3CGRfxd5nmmFMfXm4+EL0xNwslnD+Bw6NzMHEwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUjl2QNHhYuqrYcNi9+6aoXntWO2QwHwYDVR0jBBgwFoAUjl2QNHhYuqrYcNi9+
6aoXntWO2QwCwYDVR0PBAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIAVzAMBggqgRzPVQGDdQU
AA0gAMEUCIQCGqTACsUVb7KXmi8E5pqJtyWpKj1Mm0vPokvH6ondQKwIgFH5vrHQjncD1e9avYQB
SF9fxplgZ/tdU9nxDgh2HnRU=
经过BASE64解码后
30 82 02 68 30 82 02 0C A0 03 02 01 02 02 09 00 AF 28 72 5D 98 D3 31 43 30 0C 06 08 2A 81 1C CF 55 01 83 75 05 00 30 7D 31 0B 30 09 06 03 55 04 06 0C 02 63 6E 31 0B 30 09 06 03 55 04 08 0C 02 62 6A 31 0B 30 09 06 03 55 04 07 0C 02 62 6A 31 0F 30 0D 06 03 55 04 0A 0C 06 74 6F 70 73 65 63 31 0F 30 0D 06 03 55 04 0B 0C 06 74 6F 70 73 65 63 31 11 30 0F 06 03 55 04 03 0C 08 54 6F 70 73 65 63 43 41 31 1F 30 1D 06 09 2A 86 48 86 F7 0D 01 09 01 0C 10 62 6A 40 74 6F 70 73 65 63 2E 63 6F 6D 2E 63 6E 30 1E 17 0D 31 32 30 36 32 34 30 37 35 34 33 39 5A 17 0D 33 32 30 36 32 30 30 37 35 34 33 39 5A 30 7D 31 0B 30 09 06 03 55 04 06 0C 02 63 6E 31 0B 30 09 06 03 55 04 08 0C 02 62 6A 31 0B 30 09 06 03 55 04 07 0C 02 62 6A 31 0F 30 0D 06 03 55 04 0A 0C 06 74 6F 70 73 65 63 31 0F 30 0D 06 03 55 04 0B 0C 06 74 6F 70 73 65 63 31 11 30 0F 06 03 55 04 03 0C 08 54 6F 70 73 65 63 43 41 31 1F 30 1D 06 09 2A 86 48 86 F7 0D 01 09 01 0C 10 62 6A 40 74 6F 70 73 65 63 2E 63 6F 6D 2E 63 6E 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 81 1C CF 55 01 82 2D 03 42 00 04 D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5 89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3 A3 73 30 71 30 0F 06 03 55 1D 13 01 01 FF 04 05 30 03 01 01 FF 30 1D 06 03 55 1D 0E 04 16 04 14 8E 5D 90 34 78 58 BA AA D8 70 D8 BD FB A6 A8 5E 7B 56 3B 64 30 1F 06 03 55 1D 23 04 18 30 16 80 14 8E 5D 90 34 78 58 BA AA D8 70 D8 BD FB A6 A8 5E 7B 56 3B 64 30 0B 06 03 55 1D 0F 04 04 03 02 01 06 30 11 06 09 60 86 48 01 86 F8 42 01 01 04 04 03 02 00 57 30 0C 06 08 2A 81 1C CF 55 01 83 75 05 00 03 48 00 30 45 02 21 00 86 A9 30 02 B1 45 5B EC A5 E6 8B C1 39 A6 A2 6D C9 6A 4A 8F 53 26 D2 F3 E8 92 F1 FA A2 77 50 2B 02 20 14 7E 6F AC 74 23 9D C0 F5 7B D6 AF 61 00 52 17 D7 F1 A6 58 19 FE D7 54 F6 7C 43 82 1D 87 9D 15
再解析TLV格式,得到如下表格
公钥X:D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5
公钥Y:89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3
签名后的数据:86 A9 30 02 B1 45 5B EC A5 E6 8B C1 39 A6 A2 6D C9 6A 4A 8F 53 26 D2 F3 E8 92 F1 FA A2 77 50 2B 14 7E 6F AC 74 23 9D C0 F5 7B D6 AF 61 00 52 17 D7 F1 A6 58 19 FE D7 54 F6 7C 43 82 1D 87 9D 15
取证书数据的第二层TAG的第一个TAG 30(即30 82 02 0C加上后面长度为20c的数据),得到数据M
注意:国密局的SM2证书验签时,需要对上面的数据进行数据填充(填充方式详见PBOC3.0规范第17部分)。
我猜测是这样的规则:如果签名后的数据不是TLV格式的,则直接进行SM3计算,否则就需要进行数据填充。
下面一步步对数据进行操作:
第一步,组建数据ZA并计算HASH值
00 80(用户ID的bit位长度)
31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38(用户ID)
FF FF FF FE FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FC (椭圆曲线公钥密码算法推荐曲线参数a)
28 E9 FA 9E 9D 9F 5E 34 4D 5A 9E 4B CF 65 09 A7 F3 97 89 F5 15 AB 8F 92 DD BC BD 41 4D 94 0E 93 (椭圆曲线公钥密码算法推荐曲线参数b)
32 C4 AE 2C 1F 19 81 19 5F 99 04 46 6A 39 C9 94 8F E3 0B BF F2 66 0B E1 71 5A 45
89 33 4C 74 C7 (椭圆曲线公钥密码算法推荐曲线参数Gx)
BC 37 36 A2 F4 F6 77 9C 59 BD CE E3 6B 69 21 53 D0 A9 87 7C C6 2A 47 40 02 DF 32 E5 21 39 F0 A0(椭圆曲线公钥密码算法推荐曲线参数Gy)
D6 9C 2F 1E EC 3B FB 6B 95 B3 0C 28 08 5C 77 B1 25 D7 7A 9C 39 52 5D 81 90 76 8F 37 D6 B2 05 B5(公钥X)
89 DC D3 16 BB E7 D8 9A 9D C2 19 17 F1 77 99 E6 98 53 1F 5E 6E 3E 10 BD 31 37 0B 25 9C 3F 81 C3(公钥Y)
对上面数据进行SM3计算得到
4D 38 D2 95 8C A7 FD 2C FA E3 AF 04 48 69 59 CF 92 C8 EF 48 E8 B8 3A 05 C1 12 E7 39 D5 F1 81 D0
第二步,上面的SM3结果加上数据M,再进行SM3计算得到
HASH值:C3 B0 2E 50 0A 8B 60 B7 7D ED CF 6F 4C 11 BE F8 D5 6E 5C DE 70 8C 72 06 56 54 FD 7B 21 67 91 5A
最后再做
t=(r+s) mod n
(x,y)=[s]G + [t]P
R=(e+x)mod n
计算R==?r,相等则验签通过!