SM2 算法 ASN.1编码 - 签名长度
一、常规理解
SM2算法正常不做编码的签名长度为64个字节,即 r + s,各32个字节;
即使经过了ASN.1 DER编码,通常理解签名长度只有3种可能性,即:70字节、71字节、72个字节,分别对应:
70个字节:
3044 + 0220 + 32个字节r + 0220 + 32个字节s
比如:
3044 0220 2f7b7727784ba1ab963985ad577bd712026fa451421b07dff07eef11162cc733 0220 1f206f192175577f9cccce8377d7233c177b39bcced3717a1a83f54d677134cb
71个字节:
3045 + 022100 + 32个字节r + 0220 + 32个字节s
3045 + 0220 + 32个字节r + 0221 00 + 32个字节s
比如:
3045 0220 038a7e7fcadb57d3509e689abea97af39e7cc3c9435acd545f7191d272b8ae57 022100 cb4c0d66bd68d74538320c969e7564a40c7a08627d136992f440a549030346af
3046 + 0221 00 + 32个字节r + 0221 00 + 32个字节s
二、实际存在的情况
在ANS.1 编码中,有以下几种特殊情况存储:
(1)69个字节
情形1:
3043
021F
2DF69838E2E40DE378C9B8A2FD40FB87425AF4DB9297B9337A9B6586CBFAF3
0220
67301CAC496D878723EC946F570922A3D84A6B8D2E618C6AD907E36B13D4833F
情形2:
3043
0220
53EB989118AD14E1CA91A93769CCE234079169A94BFF645240D7DF59FFEF8B5E
021F
3B27E6F7849714C6A8EFD43C9E8045BA9B01477C7ADC3C7AFDF8056EBE05CF
(2)70个字节
情形1:
3044
021F
638026332E9FCD750647AFCFC2A5CFD3639D5BF1C9D619F23740241257FD3C
022100
9862D169D9F5BDA16848DB5D1BEDE5A616914680B6CADF1AE373A3D03D365ACF
情形2:
3044
022100
E92A4B5821120820CE2F45DFD58C07B9F1D69C7483009ADA9206678661FC5A65
021F
1DBED6061F0AAEFB3B444EBA2361E0B28A1EB5D8AC789F5D218DA8A8616E2F
情形3:(特别注意)
3044
0220
36A245F75927E7B8B09C9827F92B3913117771679B70838273BA547751778FC5
0220
00B1E4BCF9FF3ABADC596936FFBA0CA59C1A0E812DD7F5A9BEDC36863C11D119
3044
0220
0A7BF6655422E053B7E2D4C5609ED88DD98DC7B52A618A6474D01F86FE2B5614
0220
0084D6C1A052FA6FBCA036EDFACFEBBAB90A53442C3DCEA748AABCD41E7E1C91
特别注意这个数据,s数据存在00,但实际编码长度时,并未删除。
针对以上现象,需要注意的是,r或s数据中存在前导0时,是否删除,取决于其后一个字节,是否存在补位(即第一个字节最高位是否为1),从上面数据可知:
021F2D、021F1D、021F3B、021F63删除了前导0
022000B1、02200084 保留了前导0
均符合了上面的规律,因此在数据解析和编码时,要特别注意。
原文始发于微信公众号(利刃信安):【能力验证】SM2 算法 ASN.1编码 - 签名长度
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论