关于SM2算法 ASN.1编码 - 签名长度
写这篇文章是为了在SM2签名编码解析上少走弯路,签名长度会超出我们预期的不同。
一、常规理解
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编码 - 签名长度
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论