密码学基础之ASN.1编码

简介

  • ASN.1(Abstract Syntax Notation One),抽象语法标记。
  • ASN.1是一种国际标准的正式语言,由国际标准化组织(ISO)和国际电信联盟(ITU-T)共同制定,用于定义数据结构的抽象语法。它的设计目标是为了提供一种独立于特定计算机硬件、操作系统或编程语言的方式,来描述数据的结构和编码规则,以便在网络上传输和处理数据。
  • 那么为什么要熟悉ASN.1编码?因为在密码学中,像数字证书、公私钥、P7数字签名等信息都是ASN.1编码的数据。熟悉ASN.1编码才能更方便的去分析数据。

格式

  • <新类型的名字> ::=<类型描述>
    • <新类型的名字>: 一个以大写字母开头的标识符
    • <类型描述>: 基于内建类型或在其它地方定义的类型
    • 示例
      •   SM2Signature ::=SEQUENCE{R INTEGER,S INTEGER}
        

DER编码

  • ASN.1的编码格式有很多种: BER、CER、DER、XER,密码学上大部分使用DER编码。

  • DER编码遵循TLV格式,即Type,Length,Value

  • Type

    通常为1个字节,创建类型如下:
    编码类型描述类别
    0x01BOOLEAN布尔类型,TRUE或FALSE基本类型
    0x02INTEGER用于表示整数值,可以是正数、负数或零
    0x03BIT_STRING位字符串,每个位可以独立设置为0或1
    0x04OCTET_STRING八进制字符串
    0x05NULL表示一个特殊的空值
    0x06OID用于唯一标识ASN.1定义的对象或类型
    0x0cUTF8StringUnicode字符的UTF-8编码字符串字符串类型
    0x30SEQUENCE包含一个或多个类型的有序字段系列构造类型
    0x31SET包含一个或多个类型的无序字段系列
  • Length

    • 为定长及不定长类型,一般为1-3字节,定长分为短格式和长格式。这里只介绍定长格式。
    • 如果value的值小于等于127个字节,那么Length占用一个字节,表示Value值的长度。
    • 如果value的值大于等于128个字节,则第一个字节的最高位会被设置为1,其余的7位用于表示后续字节中用来表示实际长度的字节数。之后的字节则按顺序组成实际的长度值。
    • 在这里插入图片描述
    • 如图,Value长度为52个字节,Length占用1个字节,值为52,表示的就是Value的长度。
    • Value的值为4934个字节时,Length占用了3个字节,第一个字节的最高位被置为1,其余7位表示Length还需要占用多少个字节,这里值为2,表示Length还需要占用2个字节,往后再取2个字节,值为4934个字节,表示Value的实际值为4934个字节。
  • Value: 存储实际的数据值,其格式和内容依据前面的Type和Length决定

类型详解

  • ASN.1数据在线解析网站
  • OID在线查询网站
  • 数据类型中,INTEGER、BIT STRING和OID这三种类型编码比较复杂,也比较难理解,会重点进行介绍。

BOOLEAN

  • 布尔值可以是 TRUE 或 FALSE
  • 在这里插入图片描述

INTEGER

  • 如果整数为正数,但高阶位设置为 1,则会将前导0x00添加到内容中,以指示数字不是负数。 例如,0x8F (10001111) 的高阶字节为 1。 因此,将前导零字节添加到内容,如下图所示。
  • 在这里插入图片描述
  • 解析一个SM2加密后的ASN.1编码的密文数据分析以下。
  • 在这里插入图片描述
  • 看下第一个整数,从第3个字节开始,02表示类型,20表示整数的值长度,为32个字节。从07开始到1D,就是实际的Value值。
  • 在这里插入图片描述
  • 再看第2个整数,02表示类型,21表示长度,为33个字节。然后是Value值,可以看到Value值的第一个字节是00,这是填充的数据,后面AB开始才是实际的Value值。为什么要填充00?因为整数值的最高位表示正负数,AB值的最高位为1,如果不填充00,就会把AB开始的Value值当作负数处理,因此最高位填充00,表示正数。

BIT STRING

  • BIT STRING类型是用来表示任意长度的二进制位序列,这种类型可以包含0个或多个比特,并且可以明确指定哪些比特位是重要的或者说是意义明确的,而其余未标记的比特位通常是填充的或应被忽略的。
  • 在这里插入图片描述
  • 如图所示,BIT STRING类型的V部分的第一个字节为数据填充标志,表示实际数据需要填充多少位。如果实际数据长度的位数不是8的整数倍,需要填充成8的整数倍,具体填充多少位,就在V的第一个字节中表示。如果实际数据长度的位数是8的整数倍,不需要填充,则V的第一个字节数据填充标志就为0x00。数据填充标志后面部分才是实际的数据值。
  • 在这里插入图片描述
  • 如上图所示,T为0x03,表示类型为 BIT_STRING。L为0x03,表示数据长度占3个字节。V的第一个字节为0x04,表示实际的值有四个未使用的位,需要填充,可以看到V的第三个字节的后四位填充了xxxx,填充的值是什么无所谓,但是这四位的值是不使用的,一般都是填充0。
  • 再分析以下一组Hex数据
    •   03 81 81 00 47 eb 99 5a df 9e 70 0d fb a7 31 32 c1 5f 5c 24 c2 e0 bf c6 24 af 15 66 0e b8 6a 2e ab 2b c4 97 1f e3 cb dc 63 a5 25 ec c7 b4 28 61 66 36 a1 31 1b bf dd d0 fc bf 17 94 90 1d e5 5e c7 11 5e c9 55 9f eb a3 3e 14 c7 99 a6 cb ba a1 46 0f 39 d4 44 c4 c8 4b 76 0e 20 5d 6d a9 34 9e d4 d5 87 42 eb 24 26 51 14 90 b4 0f 06 5e 52 88 32 7a 95 20 a0 fd f7 e5 7d 60 dd 72 68 9b f5 7b 05 8f 6d 1e
      
  • 第一个字节为0x03,表示类型为BIT_STRING。第二个字节为0x81,二进制为 10000001,可以看到最高位为1。回顾上文中Length的编码规则,如果Length的第一个字节最高位为1,则其他7位表示Length占用了几个字节,这里其他7位为1,表示Length占用了一个字节,往后再取一个字节,为0x81,这个表示的才是Value的实际长度,为129个字节。后面就是Value部分,第一个字节为0x00,表示数据部分不需要填充,0x00后面的内容就是实际的值。
  • 我们通过ASN.1数据在线解析网站 分析下这部分数据。
  • 在这里插入图片描述
  • 可以看到,Length表示的长度为 129个字节,但实际数据长度是1024位,也就是128个字节。说明Value部分的第一个字节只表示填充信息,不是实际的数据信息。
  • 那么有以下两组位串数据,我们尝试进行下ASN.1编码
    •   {1,1,0,1,0,1,0,1}{1,0,1,1,0,1,1,1,0,1,0,0,1}
      
    • 第一组数据进行编码,类型为 0x03,数据长度为1个字节,再加一个填充标识字节,Length为 0x02,数据长度为8位,不需要填充,则Value部分的第一个字节为0x00,第二个字节为实际的值 0xd5。则最终编码值为 030200d5。
    • 第二组数据进行编码,类型为 0x03,数据长度为2个字节,再加一个填充标识字节,Length为0x03,数据长度为13位,必须为8的倍数,因此填充3个字节,则Value部分的第一个字节填充标志为0x03。这里可以直接填充0,那么实际的值为1011011101001000,即为0xb748。最终编码值为 030303b748。
    • 分别解码看下
    • 在这里插入图片描述
    • 在这里插入图片描述

NULL

  • 长度为 0x00,且不带值字节
  • 在这里插入图片描述

OID

  • OID(OBJECT IDENTIFIER)对象标识符。

  • OID编码规则

    • 第一个字节编码是固定的,为OID数据的第1个数据乘以40再加上第2个数据。
    • 后面的其他数据,如果小于等于127,则直接进行编码。
    • 如果数据大于127,需要用多个字节表示。先将这个数据拆分为 x * 128 + y的形式,比如401 = 3 * 128 + 17的形式,然后第一个字节就为x,第二个字节为y。x为0x03,二进制为 00000011,但是x不能编码出401,需要和y一起编码才能表示401,因此需要将x的最高位替换为1,表示后面还有字节来编码401,替换后为10000011,编码为0x83,y为17,二进制为 00010001,x和y可以成功编码出401,后面没有其他数据了,y就不需要替换最高位,直接编码为 0x11,则401的最终编码为 0x83,0x11。
  • SM3WITHSM2的OID为 1.2.156.10197.1.501,尝试进行下编码

    • 请添加图片描述

    • 为了方便,这里用 a.b.c.d.e.f 代表 1.2.156.10197.1.501

    • 先编码1个字节。值为 1 * a + b = 1 * 40 + 2 = 42,编码为0x2A。

    • 再编码第2个和第3个字节。c = 156 = 1 * 128 + 28,则第二个字节1,二进制为 00000001,最高位需要替换为1,表示后续还有其他字节,为 10000001,编码为0x81,第三个字节为28,二进制为00011100,后续没有其他字节,直接编码为0x1C。

    • 接着编码第4个和第5个字节。d = 10197 = 79 * 128 + 85,则四个字节为79,二进制为01001111,后面还有其他字节,第一位替换为1,为11001111,编码为0xCF,第五个字节为85,二进制为01010101,后续没有其他字节,编码为0x55。

    • 第6个字节编码。e = 1,直接编码为0x01

    • 第7个和第8个字节编码。f = 501 = 3 * 128 + 117,第7个字节为3,二进制为 00000011,后面还有其他字节,最高位替换为1,为 10000011,编码为0x83,第8个字节为117,二进制为01110101,编码为0x75。

    • 最终编码值为 2A 81 1C CF 55 01 83 75,加上T和L,则OID最终编码为 06 08 2A 81 1C CF 55 01 83 75

    • 在这里插入图片描述

  • 国密算法的OID含义

    对象标识符OID对象标识符定义类别
    1.2国际标准化组织成员表示通用对象标识符
    1.2.156中国
    1.2.156.197国家密码管理局
    1.2.156.10197国家密码行业标准化技术委员会
    1.2.156.10197.1密码算法
    1.2.156.10197.1.100分组密码算法分组密码算法对象标识符
    1.2.156.10197.1.102SM1分组密码算法
    1.2.156.10197.1.103SSF33分组密码算法
    1.2.156.10197.1.104SM4分组密码算法
    1.2.156.10197.1.200序列密码算法序列密码算法对象标识符
    1.2.156.10197.1.201祖冲之序列密码算法
    1.2.156.10197.1.300公钥密码算法公钥密码算法对象标识符
    1.2.156.10197.1.301SM2椭圆曲线公钥密码算法
    1.2.156.10197.1.301.1SM2-1数字签名算法
    1.2.156.10197.1.301.2SM2-2密钥交换协议
    1.2.156.10197.1.301.3SM2-3公钥加密算法
    1.2.156.10197.1.302SM9标识密码算法
    1.2.156.10197.1.302.1SM9-1数字签名算法
    1.2.156.10197.1.302.2SM9-2密钥交换协议
    1.2.156.10197.1.302.3SM9-3密钥封装机制和公钥加密算法
    1.2.156.10197.1.400杂凑算法杂凑算法对象标识符
    1.2.156.10197.1.401SM3密码杂凑算法
    1.2.156.10197.1.401.1SM3密码杂凑算法, 无密钥使用
    1.2.156.10197.1.401.2SM3密码杂凑算法, 有密钥使用
    1.2.156.10197.1.500组合运算机制组合运算算法对象标识符
    1.2.156.10197.1.501基于SM2算法和SM3算法的签名
    1.2.156.10197.1.504基于RSA算法和SM3算法的签名
    1.2.156.10197.4.3CA代码CA代码对象标识符
    1.2.156.10197.6标准体系标准体系对象标识符
    1.2.156.10197.6.1基础类
    1.2.156.10197.6.1.1算法类
    1.2.156.10197.6.1.1.1《祖冲之序列密码算法》
    1.2.156.10197.6.1.1.2《SM4分组密码算法》
    1.2.156.10197.6.1.1.3《SM2椭圆曲线公钥密码算法》
    1.2.156.10197.6.1.1.4《SM3密码杂凑算法》
    1.2.156.10197.6.1.2标识类
    1.2.156.10197.6.1.2.1《密码应用标识规范》
    1.2.156.10197.6.1.3工作模式
    1.2.156.10197.6.1.4安全机制
    1.2.156.10197.6.1.4.1《SM2密码使用规范》
    1.2.156.10197.6.1.4.2《SM2加密签名消息语法规范》
    1.2.156.10197.6.2设备类
    1.2.156.10197.6.3服务类
    1.2.156.10197.6.4基础设施
    1.2.156.10197.6.5检测类
    1.2.156.10197.6.5.1《随机性检测规范》
    1.2.156.10197.6.6管理类

SEQUENCE

  • 可以把 SEQUENCE 类型看成C语言中的结构体
  • 解析一张x509格式的数字证书看下
    • 在这里插入图片描述
  • 可以看到 SEQUENCE 中包含了其他 SEQUENCE 类型或者基本类型。
  • SEQUENCE 没有特殊的编码规则,就是按照标准 TLV格式进行编码。

SET

  • SET 也可以看成是C语言中的结构体,与 SEQUENCE 不同的是,SET是有序的。
  • 同样解析一个x509格式的数字证书
    • 在这里插入图片描述
  • 可以看到subject部分CN、ST、L、O、OU、CN的类型都为SET,说明必须按顺序进行排列。

参考

  • ASN.1 类型的 DER 编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366279.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双端队列广搜——AcWing 175. 电路维修

双端队列广搜 定义 双端队列广搜&#xff08;Breadth-First Search with a Deque&#xff09;是一种图或树的遍历算法变体&#xff0c;它利用了双端队列&#xff08;Deque&#xff0c;全称Double Ended Queue&#xff0c;允许在其两端进行插入和删除操作&#xff09;作为数据…

docker-compose搭建minio对象存储服务器

docker-compose搭建minio对象存储服务器 最近想使用oss对象存储进行用户图片上传的管理&#xff0c;了解了一下例如aliyun或者腾讯云的oss对象存储服务&#xff0c;但是呢涉及到对象存储以及经费有限的缘故&#xff0c;决定自己手动搭建一个oss对象存储服务器&#xff1b; 首先…

基于YOLOv10的车辆统计跟踪与车速计算应用

文章目录 1、前言2、安装运行环境3、下载v10s模型4、代码实现5、代码详读5.1、导入必要的库5.2、识别车辆5.3、读取视频文件5.4、创建视频写入器5.5、车速计算5.6、统计车辆5.7、应用跟踪5.8、视频处理 6、目标检测系列文章 1、前言 在智能交通系统&#xff08;ITS&#xff09…

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中&#xff0c;我钟情于node&#xff0c;高效的异步处理真是让我眼前一亮&#xff0c;同时&#xff0c;简单易懂的语法也让我非常倾心 但是但是&#xff0c;因为考虑要写一个深度学习算法的后端接口&#xff0c;所以不得不选用python作为…

【源码+文档+调试讲解】基于vue的线上点餐系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐系统的系统分析部分&…

产品经理-对产品经理的认识(1)

今天跟大家聊一下产品经理这个岗位的,产品经理是互联网岗位当中比较火的一个岗位,也是最接近CEO的岗位 产品经理岗位&#xff0c;技术门槛低&#xff0c;薪水和前景都很不错&#xff0c;又处于团队的核心位置 产品经理岗位没有完全相关的专业设置和清晰的学习路径&#xff0c;绝…

信号“地”的分类

无论是在模拟电路中还是在数字电路中都存在着个种各样的“地”。信号“地”又称参考“地”&#xff0c;就是零电位的参考点&#xff0c;也是构成电路信号回路的公共段&#xff0c;图形符号“⊥”。 (1) 数字地DGND&#xff1a;也叫逻辑地&#xff0c;是数字电路中各种开关量&a…

7.1.SQL注入-基于函数报错的方式来利用updatexml()

基于函数报错的方式来进行利用-字符型&#xff08;本页updatexml()&#xff09; 前提条件是后台数据库没有屏蔽数据库语法报错信息 updatexml()方法详解 注释&#xff1a; 第一个参数&#xff0c;意思就是xml文档的名称 第二个参数&#xff0c;意思就是定位到xml文档中指定…

C++专业面试真题(1)学习

常用Linux命令 ls&#xff1a;列出当前目录内容 ls -l&#xff1a;详细信息列表 ls -a&#xff1a;包括隐藏文件 cd&#xff1a;更改目录 pwd&#xff1a;显示当前目录路径 mkdir&#xff1a;创建新目录 rmdir&#xff1a;删除空目录 rm&#xff1a;删除文件或目录 rm -…

vision mamba-yolov8:结合Vmamba的yolov8目标检测改进实现

1.vision mamba结构与原理 Mamba成功的关键在于S6模型&#xff0c;该模型为NLP任务设计&#xff0c;通过选择性扫描空间状态序列模型&#xff0c;将二次复杂度降低至线性。但由于视觉信号&#xff08;如图像&#xff09;的无序性&#xff0c;Mamba的S6模型不能直接应用&#xf…

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单&#xff08;如下图&#xff09;&#xff0c;但是qt的QLabel不会响应点击事件&#xff0c;那就从QLabel继承一个类&#xff0c;然后在该类中重写mousePressEvent函数&#xff0c;并在该函数中对左键点击事件做响…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…

如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK

1.先下载需要的字体。 下载字体的网站比较多&#xff0c;基本上都是免费的。随便在网上搜索一个就可以了&#xff0c;下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 ​www.fonts.net.cn/font-31602268591.html 注意&#xff1a;切记不要商用&#xff0c;以免…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了&#xff0c;美好的大学四年也结束了&#xff0c;作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

《解答元器件的排列方式》

之前刚接触电子的时候&#xff0c;心里有个疑惑&#xff0c;为什么线路板上的电子元器件是纵横交错的排列方式&#xff0c;为什么不能是像表格一样&#xff0c;一行一列&#xff0c;整整齐齐的排列&#xff1f;为什么这个芯片必须要放在线路板的中心位置呢&#xff1f;相信不少…

【面试系列】产品经理高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

深入理解 XML 和 HTML 之间的区别

在现代网络技术的世界中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和 HTML&#xff08;超文本标记语言&#xff09; 是两个非常重要的技术。尽管它们都使用标签和属性的格式来描述数据&#xff0c;但它们在形式和用途上有显著的区别。 概述 什么是 XML&#xff…

[数据集][目标检测]睡岗检测数据集VOC+YOLO格式3290张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3316 标注数量(xml文件个数)&#xff1a;3316 标注数量(txt文件个数)&#xff1a;3316 标注…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…