起因

工作相关的朋友咨询我sm2签名长度的问题,故有了这篇文章。

过程

  1. 问:按照国密规范,签名长度64,为什么长度可变?

答:要按这个假设,应该的范围是68,69,70,71,72。
最好是按asn1解析

  1. 问:我刚才看了下GM/T 0003.2中的规定,看上去签名结果就应该是(r,s)的字符串形式64个字节的,我后来看了下这个文档的附录A中的两个用例,签名的结果都是r:32字节 s:32字节 签名结果为(r,s) 64字节

答:但是会有格式的问题,不是值的问题。

  1. 确实,我还没找到()这个代表什么意思,并不是直接r||s的表示

答:那r和s其实也就是转换成字节串的坐标了,()应该是坐标表示

  1. 看下了009的7.3,签名asn.1定义确实是64字节的,格式中没有找到处理R和S的其他标识字段,INTEGER应该不是结构吧?

应该是asn1的编码问题,按照asn.1的TLV这个结构

  1. V好像是1或者两个字节?根据V的长度,L可能是1或者2个字节?

V是32。我的理解是,由于T与V的特殊组合,导致实际的V做了高位扩展。这个假设是TL不变的。按照道理说应该不变,若这样,会涉及兼容问题,以及牵扯出的维护的问题。所以TL应该不变,V在特定表示T时,由于其包含内容的特殊性,导致实际的值是会扩展的。

  1. 芯片出来的就是单纯的没有asn.1编码的R||S

所以说你直接用asn1解析下,直接可以看出结果了

  1. 那长度应该就是2+2*(1+1+32),会出现71和72字节长度的情况么?

应为扩展就会,比如R在做asn1编码时,遇到了特殊情况,致使R的值多了一个高位扩展。这只是推测,实际还是用asn1解析做验证。如果不放心,看下asn1的代码。

  1. 验证签名的输入数据是不是也要进行asn.1编码呢?

如果用库,应该是,如果是芯片的sdk应该不用.

9.之前做秘钥保护结构就出现过此类问题,如何应对?

减少维护工作,就是用库。
有os的话,建议直接用响应的库,例如用openssl在中间环节进行asn.1编解码;
如果是裸机程序,最好是找下asn1的小型实现。

总结

首先,感谢这位朋友对本人技术的信任,才有此总结,并再次更新对这个知识点的掌握。
其次,交流是两个人都付出时间和精力的过程,更是值得珍惜。
最后,启发自己对于项目管理的一点经验,以这次对话为例,朋友的环境会有两种情况,一种是单板程序,一种是os的应用,都可能应对asn1编解码的问题。需要权衡,是否需要不同对待,还是对于不同的环境,采用不同的解决方法。在权衡众多因素时,遵循的规律是一致的,只是采取的手段不同罢了。

由asn1编码引发对sm2签名长度思考相关推荐

  1. 通过BouncyCastle包进行Java签名C#验签时要注意asn1编码转换

    在Java中采用BouncyCastle的Jar(bcprov-jdk15on-1.58.jar)对授权数据进行签名.因为项目的历史原因,没用采用更高版本jar包.签名后,把授权数据和签名发给C#的应 ...

  2. 基于gmssl SM2 签名验签测试程序

    基于gmssl SM2 签名验签测试程序 前言 一.sm2 签名流程 二.sm2 验签流程 三.测试结果 总结 前言 在之前的文章中讲解了基于gmssl 的SM2的加解密接口的测试程序,这里主要讲解签 ...

  3. SM2 签名预处理操作

    如果觉得写得不错,烦请微信搜索公众号 "郑州行疆户外" 了解程序员的户外业余喜好. 转载:https://www.xuebuyuan.com/1473900.html 一般情况下, ...

  4. c语言如何在1序号方编程,asn1编码的理解

    数据序列化:将高级语言代码转变成二进制流的过程称为数据的序列号,数据序列化的目的是物理存储或网络传输.在计算机高级程序编程语言里有许多结构化的结构,比如:数.图和结构体等,如何在网络中传输这些结构化的 ...

  5. java 国密p7验签_go/Java 国密sm2签名验签

    近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项 1 关于密钥对 密钥生成可以使用openssl库,openssl版本至少是1.1.1 ...

  6. 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位?

    转发的:https://www.ituring.com.cn/article/111027的文章 刨根问底:C++中宽字符类型(wchar_t)的编码一定是Unicode?长度一定是16位? cons ...

  7. java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...

    我收到此错误(在标题中).我不确定为什么,请帮忙.代码如下: public static String decryptRSA(Context mContext, byte[] message) thr ...

  8. 编码字符串,使得总长度最短

    字符串"liulishuo",我们需要对该字符串每个字符编码,使得编码后的字符串总长度最小. 我们可以通过哈夫曼树来对字符编码,累积树中非叶子节点的和即为所求总长度. 总长度也等于 ...

  9. SM2签名方案的安全性

    文章目录 前言 一.Contribution 二.Preliminaries 1. Uniform (Smooth) Hash Functions^[https://link.springer.com ...

最新文章

  1. 详细透彻的分析DM9000网卡驱动程序(4)
  2. C# 自定义 implicit和explicit转换
  3. android 颜色填充工具栏,Android工具栏颜色未由colorPrimary设置
  4. 布隆过滤器(Bloom Filter)的原理和实现
  5. Android模拟器之神奇Genymotion的安装
  6. java开发学生管理系统,看这篇足矣了!
  7. MySQL Workbench运行脚本
  8. python与线性代数 线性方程组的解集
  9. ctc网络结构中接口服务器信号交换的方式有哪些,通信工程复习资料
  10. 开启html元素的编辑模式contenteditable=true
  11. 你知道怎么解决DB读写分离,导致数据不一致问题吗?
  12. J2EE基础篇——十三个规范
  13. 关于LINUX输入法候选框光标跟随的代码的一个网页
  14. [转] C# mysql 事务回滚
  15. “站长也疯狂,开车盛宴”——如何选择运维产品
  16. 日语开发java自我介绍,用日语自我介绍,这些你一定会用到
  17. 中国移动通信互联网短信网关接口协议及相关下载
  18. GitHub搜索技巧整理
  19. 计算机基础课教学心得,浅谈高专院校计算机基础课程的教学心得体会养
  20. 基于脑机接口的人脑控制机械手臂

热门文章

  1. 新突破!德国MPQ证实光子是量子比特载波的优选
  2. 与鲨共舞:当AI遇见海洋杀手
  3. 我认为接口存在的意义
  4. 星星下落_与星星共舞
  5. css之overflow
  6. 如何使用BBP公式直接计算π的第n位
  7. 上海海洋大学计算机考研资料汇总
  8. cpld xilinx 定义全局时钟_FPGA/CPLD设计工具:Xilinx ISE 5.x使用详解
  9. JAVA 洗衣房管理系统 宿舍洗衣机管理系统
  10. Source Insight中无法正确判断宏定义的问题