关于SM2算法 ASN.1编码 踩过的坑 - 加密

 在某些项目开发过程中,或多或少很多底层安全OS系统或者算法库,都引入了openssl或者gmssl的一些内容来实现算法,这样就导致算法运算结果并不是完全按照国密标准的裸数据,而是经过编码之后的数据,编码之间的对齐对上层业务系统互通带来的一些挑战。

以一个手机TEE里面TA实际出现的场景举例,APP应用访问TA进行算法运算,在TA里面进行SM2算法加密之后,正常情况下TA结果为 C1x+C1y+C3(Hash)+ C2(CipherText),经过ASN.1编码后正常数据(以加密22个字节数据为例)为:

307E
0220
31F54CC0FDE5CD157B1FB0649C94E527C615175F20728D377BEC41115382709A  /*C1x*/
0220
74C5BFA964DB81FC7C298C3D580725455747D1459DEED2948C4741299D95DEA3 /*C1y*/
0420
022A51ABEC9ACFEE8E2F5438A4526C8084600CDE3CB26188237194E594F3DEC2 /*Hash*/
0416
32BDB7F56DA4C7C444A2CAF5489FC5E628E40DB3CD06 /*CipherText*/

但实际系统里面,在C1x\C1y这块会偶然出现一些意想不到的结果,如:

307D
0220
15A7280C39E3CB96960931170ED40CE286B89AC6E623D1E2A29C492AB2BC7F6E  /*C1x*/
021F
7C9B7B1DA124AC10ADB08B2AD9D07B4737326ACD2C9E07173DD786B79595f8   /*C1y*/
0420
882CC28818D3DF5287071A1B7DBA37150583D2C3F90E5B44B319A68ABF675B5B  /*Hash*/
0416
7C8D9C9895DCA83E35D85C5318384323725D67CF744B/*CipherText*/

两个数据的差异在于:

C1y的长度不一样,正常为32个字节,不正常的为31个字节,如果直接取数据会导致业务异常。

经过分析发现,C1y的数据也是对的,原因是C1y丢失的那个字节是为0,不计算在长度里面,在上层业务系统中,需要进行补0 操作。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值