关于SM2算法 ASN.1 DER编码

1、参考国密规范 《GM/T 0009-2012 SM2密码算法使用规范》

确定SM2公私钥、加密密文、签名、密钥对保护等数据的ASN.1类型定义。

以SM2加密后的密文为例:

这里面定义了 C1x、C1y的数据类型为INTEGER。

2、熟悉ANS.1 DER编码规则,下面就具体数据进行说明。

2.1 SM2加密后密文

以一个实际ANS.1 DER编码后的SM2密文举例,这是一个长度超过127的编码数据原文:

308180022100B06CF6D2ADBD8AEBCCE0A8AFBC2F2667F51E2E956B078E8B4696A0BE4847B244022100D6E6E15DD4A5B9683B1159B46B60F1ED54B7B5AA6E0D68A074D0A82EE629FC7304204DB1118200B6D62293E81DBFF53E059BD3D74ADDE2EAFA1904B11082C9C1D85204169A9189B6F3FB4FABB5C8292F2CCDBA17D3C701702EAE

解码分析:

(1)开头解析

30 81 80 为报文头,需要注意DER长编码和短编码的区别,注意看第二个字节的最高位是否为1

》长度小于127(编码),第二个字节最高位固定为0,如 0 X X X X X X X,其他bit7~bit1为实际长度,最大值 0111 1111 转换十六进制为 0x7F  

》长度大于127,多字节编码,第二个字节最高位固定为1,举例的数据属于这种

81 对应二进制 : 1000 0001,bit8固定位1,bit7~bit1 表示内容的长度需要占用几个字节,如果bit7~bit1 为1,表示后面有1个字节表示长度。如果为2,表示后面有2个字节是用于表示长度 ,依次类推。举例数据中,只有1个字节表示长度,因此后面的80代表内容长度;

80代表后面内容长度为128个字节。

(2)内容解密

022100 ,02代表类型, 21代表数据长度,00 代表补位,后面为C1x

B06CF6D2ADBD8AEBCCE0A8AFBC2F2667F51E2E956B078E8B4696A0BE4847B244

关于为什么02 21后面会加一个补位00,这个需要根据C1x的第一个字节是否大于128(0x80),如果大于或者等于128,则需要补位00,否则为 02 20+ 32个字节C1x数据;

022100 ,02代表类型, 21代表数据长度,00 代表补位(同理C1x),后面为C1y

D6E6E15DD4A5B9683B1159B46B60F1ED54B7B5AA6E0D68A074D0A82EE629FC73

0420 中,04代表类型, 20代表Hash数据长度(32个字节),后面内容为Hash

4DB1118200B6D62293E81DBFF53E059BD3D74ADDE2EAFA1904B11082C9C1D852

0416 ,04代表类型, 16代表密文数据长度(22个字节),后面为密文

9A9189B6F3FB4FABB5C8292F2CCDBA17D3C701702EAE

(3)注意事项

》新旧标准关于密文顺序的定义,新标准 C1 C3 C2 即 C1x +C1y  + Hash + Ciphertext

》注意密文开头是否存在固定 04 标识

》注意临界时缓冲区大小设置

短编码临界缓冲区最大为129个字节,即

 30 7F + 数据,整个编码后的数据长度实际为: 0x7F数据长 +2个字节(307F)= 129个字节 

2.2 SM2签名后数据

(1)签名数据类型定义

(2)由于签名数据结构较为简单,这里面只罗列ASN.1 DER编码规则

编码格式1(最短,70个字节): 30 46 + 02 20 + R + 02 20 + S

编码格式2(中,71个字节): 30 47 + 02 21 00 + R + 02 20 + S  或者   30 47 + 02 20 + R + 02 21 00 + S

编码格式3(最长,72个字节):30 48 + 02 21 00 + R + 02 21 00 + S  

R、S签名的补位规则,跟前述的密文是一样,R第一个字节大于或等于128(0x80)时,需要补位00。同理,S第一个字节大于或等于128(0x80)时,需要补位00。

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值