SM2生成的密钥对:
公钥X:长度32字节 22E398B3B91D0B042C77C86730DE4F9F47BC158A1794FD601D48377ED03DBDAE
公钥Y:长度32字节 66ADFBC2E96042198DDD70710E997068311E9023A33E4380BFFA995366D6CCFC
私钥:长度32字节 50F0388A2946A066C21738F385C1A35D4068091488E6EC2B9EA1F3F9FD21C96C
SM2公钥的格式可以是X||Y,常见的还有04||X||Y(65字节),04标识未压缩公钥
用私钥可以计算出公钥。
SM2加密:
SM2使用公钥进行加密,大致流程是用SM2公钥对 对明文数据进行加密:
算法: SM2公钥加密
数据 长度32(0x20)字节
31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32
结果 长度128(0x80)字节
F6 F6 C2 96 B1 72 A3 40 0C AF 55 3B 4C 11 B9 34 B2 8B E7 12 3A 11 75 CF EE 36 4A 66 07 FE B7 C8 61 AA 74 8C D0 42 F3 B4 F6 12 53 73 4B 6E D8 37 94 50 BB 80 32 30 FF 45 46 A9 07 43 16 A8 8A 6D F0 18 98 DE 90 3B C4 7D 01 A6 A7 20 8E E4 7F 55 2F 30 2E 60 CF 80 7D AD C1 4C A7 41 E6 D8 82 68 12 65 99 D2 EA 33 DF B1 41 49 0E 38 5E C9 6A 4C 69 7A B2 33 87 ED BC 29 28 89 41 AE AA 76 24 25
SM2非对称加密的结果由C1,C2,C3三部分组成。其中C1是生成随机数的计算出的椭圆曲线点,C2是密文数据,C3是SM3的摘要值。最开始的国密标准的结果是按C1C2C3顺序的,新标准的是按C1C3C2顺序存放的。
注意SM2加密的结果会根据原始数据的长度发生变化,原始数据越长,加密后的数据越长。
SM2使用私钥进行解密。
SM2加密利用的随机数,所以每次解密结果的数据都是不一样的,但利用私钥进行解密都会得到相同的原始数据。
SM2签名与验签:
SM2使用私钥对数据进行签名,使用公钥对签名数据进行验签。签名数据的长度为64字节。
SM2签名由于要使用随机数,所以每次签名后的数据都不一样。
签名的输入:
私钥:50F0388A2946A066C21738F385C1A35D4068091488E6EC2B9EA1F3F9FD21C96C
待签名的字符:123456789a123456789a123456789a12
签名的结果:
算法: SM2私钥签名
数据 长度32(0x20)字节
31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32
结果 长度64(0x40)字节
4F 7D 95 8A FA 99 4C 9C CF 58 69 24 49 9A 51 44 55 66 47 A9 0C 24 98 66 A3 5A AC 3E AB 82 E6 75 3C 20 B6 67 03 AC DA 18 E1 EF 5F 67 2E 4C 8F 04 56 CB 6D 0F 08 AA 58 F6 05 7A EF 22 6B BB 09 15
签名的结果分为两个部分R和S,前面32字节为R,后面32字节为S。
R:4F7D958AFA994C9CCF586924499A5144556647A90C249866A35AAC3EAB82E675
S:3C20B66703ACDA18E1EF5F672E4C8F0456CB6D0F08AA58F6057AEF226BBB0915
验签的输入:
公钥X:长度32字节 22E398B3B91D0B042C77C86730DE4F9F47BC158A1794FD601D48377ED03DBDAE
公钥Y:长度32字节 66ADFBC2E96042198DDD70710E997068311E9023A33E4380BFFA995366D6CCFC
数据:4F 7D 95 8A FA 99 4C 9C CF 58 69 24 49 9A 51 44 55 66 47 A9 0C 24 98 66 A3 5A AC 3E AB 82 E6 75 3C 20 B6 67 03 AC DA 18 E1 EF 5F 67 2E 4C 8F 04 56 CB 6D 0F 08 AA 58 F6 05 7A EF 22 6B BB 09 15
验签的结果:
验签 通过
算法: SM2公钥验签
数据 长度32(0x20)字节
31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32
签名结果 长度64(0x40)字节
4F 7D 95 8A FA 99 4C 9C CF 58 69 24 49 9A 51 44 55 66 47 A9 0C 24 98 66 A3 5A AC 3E AB 82 E6 75 3C 20 B6 67 03 AC DA 18 E1 EF 5F 67 2E 4C 8F 04 56 CB 6D 0F 08 AA 58 F6 05 7A EF 22 6B BB 09 15
SM2签名数据的预处理
SM2签名前要不要进行预处理,一定要搞清楚,SDF/SKF,加密卡和usbkey的处理方式可能不一样。
通常密码卡仅接受长度为32字节的签名数据,根据国家标准《SM2密码算法使用规范》GM/T 0009-2012,对需要签名的数据进行预处理:
通过SM3杂凑计算后,不论多长的数据都变成了32字节。
用户id缺省值为:默认使用"1234567812345678"这个字符串值,HEX:31323334353637383132333435363738
SM2签名前预处理会增加用户标识ID和公钥x,y相关数据,先计算Z值,再利用SM3计算杂凑值。
带有预处理的签名:
私钥:50F0388A2946A066C21738F385C1A35D4068091488E6EC2B9EA1F3F9FD21C96C
待签名的字符:123456789a123456789a123456789a12
签名结果:
算法: SM2私钥签名
数据 长度32(0x20)字节
31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32
ID:16(0x10)字节
31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38
HASH:32(0x20)字节
D2 EC A7 BA C6 8F AB 56 12 0A 64 2F B0 0B 19 C3 17 92 0B EC 31 E5 43 E5 DA F3 8C 98 44 57 EC D8
结果 长度64(0x40)字节
B7 D6 91 88 E6 24 BD 8C 13 D0 E3 29 1E BE 54 AE 51 31 DA 96 7B 60 1B 7B D7 38 53 F6 8D FD EC FA E9 82 37 76 2A 4D 35 48 4B E2 62 14 0F B9 EF 31 C0 41 5E 33 8A 9D 8D DE 3C A9 E9 20 F2 30 1C 0A
注意HASH才是真正待签名的数据。
验签的结果:
公钥X:长度32字节 22E398B3B91D0B042C77C86730DE4F9F47BC158A1794FD601D48377ED03DBDAE
公钥Y:长度32字节 66ADFBC2E96042198DDD70710E997068311E9023A33E4380BFFA995366D6CCFC
数据:B7 D6 91 88 E6 24 BD 8C 13 D0 E3 29 1E BE 54 AE 51 31 DA 96 7B 60 1B 7B D7 38 53 F6 8D FD EC FA E9 82 37 76 2A 4D 35 48 4B E2 62 14 0F B9 EF 31 C0 41 5E 33 8A 9D 8D DE 3C A9 E9 20 F2 30 1C 0A
验签 通过
算法: SM2公钥验签
数据 长度32(0x20)字节
31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32 33 34 35 36 37 38 39 61 31 32
签名结果 长度64(0x40)字节
B7 D6 91 88 E6 24 BD 8C 13 D0 E3 29 1E BE 54 AE 51 31 DA 96 7B 60 1B 7B D7 38 53 F6 8D FD EC FA E9 82 37 76 2A 4D 35 48 4B E2 62 14 0F B9 EF 31 C0 41 5E 33 8A 9D 8D DE 3C A9 E9 20 F2 30 1C 0A
ID:16(0x10)字节
31 32 33 34 35 36 37 38 31 32 33 34 35 36 37 38
HASH:32(0x20)字节
D2 EC A7 BA C6 8F AB 56 12 0A 64 2F B0 0B 19 C3 17 92 0B EC 31 E5 43 E5 DA F3 8C 98 44 57 EC D8
SM2证书
sm2证书是ASN.1格式:
MIICtTCCAlqgAwIBAgIIICMGIAMHGAgwCgYIKoEcz1UBg3UwbzELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB1NIQUFOWEkxDTALBgNVBAcMBFhJQU4xKzApBgNVBAoMIlNoYWFueGlEaWdpdGFsQ2VydGlmaWNhdGVBdXRob3JpdHkxEjAQBgNVBAMMCVNoYWFueGlDQTAeFw0yMzA2MjAwMjU1NDlaFw0yNTA2MjYwMjU0NDVaMHMxCzAJBgNVBAYTAkNOMUswSQYDVQQKDEI5MTYxMDEzMU1BNlRYNzVNNTLpmZXopb/np6blvqHlpKnkuIvkv6Hmga/mioDmnK/mnInpmZDotKPku7vlhazlj7gxFzAVBgNVBAMMDjYxMDExMzU0NTUwOTkwMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEGGXx+Y1/a0UGYoi7N09iEz8jMNpI7M5QhOk4cOxV71V/+XSVDBxcmrna9IOdJLu0GnExQm8Uqog1jBO+eeUZVKOB2zCB2DAfBgNVHSMEGDAWgBQcKBgXb7Dm9vVofDTlNs9qnmrCPTAdBgNVHQ4EFgQUKMhb+8ZG+hp+1MwlCR3IOszciuowDgYDVR0PAQH/BAQDAgbAMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly8xMTcuMzIuMTMyLjc0OjM2OTAxL0NBMjAxNTA4MDcwMDAwMDE0MmNybC9jcmwuY3JsMAkGA1UdEwQCMAAwFgYDVR0gBA8wDTALBgkqgRyHhCIEAQowGAYFKlYLBwsEDwwNNTAwNDI5OTEyMDk3MTAKBggqgRzPVQGDdQNJADBGAiEAzm2mPB23rgMgPVBOwxhyhBqUiiHW6C3M9NQkh9H7L7oCIQDU5Cf0jgaQNw92fI61YDpHw1znG15dCPXA+to8qoby1Q==
利用ASN.1可以解密出公钥x,y:注意04后面64字节就是公钥x,y: