密码学基础之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 编码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发设备管理:【@ohos.multimodalInput.inputConsumer (组合按键)】

组合按键 InputConsumer模块提供对按键事件的监听。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口均为系统接口&#xff0c;三方应用不支持调用。 导入模块 import inputConsumer …

EfficientNet-V2论文阅读笔记

目录 EfficientNetV2: Smaller Models and Faster Training摘要Introduction—简介Related work—相关工作EfficientNetV2 Architecture Design—高效EfficientNetV2架构设计Understanding Training Efficiency—了解训练效率Training-Aware NAS and Scaling—训练感知NAS和缩放…

Leetcode3190. 使所有元素都可以被 3 整除的最少操作数

Every day a Leetcode 题目来源&#xff1a;3190. 使所有元素都可以被 3 整除的最少操作数 解法1&#xff1a;遍历 遍历数组&#xff0c;累加最少操作数&#xff0c;即 min(num % 3, 3 - num % 3)。 代码&#xff1a; /** lc appleetcode.cn id3190 langcpp** [3190] 使所…

自媒体常用的高清素材网站有哪些?自媒体必备的素材网站库分享

在自媒体时代&#xff0c;拥有高质量的素材库对创作者来说至关重要。素材的高清晰度、多样性和易用性可以显著提升你的内容吸引力和专业感。今天&#xff0c;我们就来探讨一些对自媒体创作者非常有用的高清素材网站。 蛙学网&#xff1a;自媒体创作者的理想选择 蛙学网为自媒体…

五、Spring IoCDI ★ ✔

5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么&#xff1f;★ &#xff08;Spring 是包含了众多⼯具⽅法的 IoC 容器&#xff09;1.1.1 什么是容器&#xff1f;1.1.2 什么是 IoC&#xff1f;★ &#xff08;IoC: Inversion of Control (控制反转)&#xff09;总…

将深度相机的实时三维坐标数据保存为excel文档

一、如何将数据保存为excel文档 1.excel文件库与相关使用 &#xff08;1&#xff09;导入相应的excel文件库&#xff0c;导入前先要进行pip安装&#xff0c;pip install xlwt import xlwt # 导入用于创建和写入Excel文件的库 (2) 建立一个excel文档&#xff0c;并在第0行写…

51单片机STC89C52RC——12.1 数据存储芯片AT24C02

目的/效果 利用存储芯片AT24C02存储数据&#xff0c;LCD1602显示存储的数据。 一&#xff0c;STC单片机模块 二&#xff0c;AT24C02存储芯片 2.1 介绍 AT24C02是一个2K位串行CMOS E2PROM&#xff0c;内部含有256个8位字节&#xff0c;采用先进CMOS技术实质上减少了器件的功…

什么是中断?---STM32篇

目录 一&#xff0c;中断的概念 二&#xff0c;中断的意义 三&#xff0c;中断的优先级 四&#xff0c;中断的嵌套 如果一个高优先级的中断发生&#xff0c;它会立即打断当前正在处理的中断&#xff08;如果其优先级较低&#xff09;&#xff0c;并首先处理这个高优…

【SGX系列教程】(五)Intel-SGX 官方示例分析(SampleCode)——RemoteAttestation

文章目录 一.RemoteAttestation原理介绍1.1 远程认证原理1.2 远程认证步骤1.3 远程认证基本流程1.4 IAS通过以下步骤验证报告的签名1.5 关键术语1.6 总结二.源码分析2.1 README2.1.1 README给出的编译流程2.2 重点代码分析2.2.0 主要代码模块交互流程分析2.2.1 isv_app文件夹2.…

RAG 基本流程及处理技巧 with LangChain

LLM 主要存在两个问题&#xff1a;幻想和缺乏领域知识。领域知识缺乏的原因是因为训练 LLM 本身的知识更新慢&#xff0c;对特定领域的知识也没有太细致的输入。 RAG 主要是解决 LLM 缺乏领域知识的问题。底层的逻辑是&#xff1a;把 LLM 作为逻辑推理引擎&#xff0c;而不是信…

小白学webgl合集-WebGL中给图片添加背景

一.实现效果 二.逻辑 为了在WebGL中给图片添加背景&#xff0c;主要的逻辑步骤包括初始化WebGL上下文、编写和编译着色器、创建和绑定缓冲区、加载和配置纹理以及绘制场景。以下是代码逻辑的详细说明&#xff1a; 1. 获取WebGL上下文 首先&#xff0c;通过获取<canvas>…

ArtTS语言基础类库内容的学习(2.10.1)

上篇回顾&#xff1a; ArkTS开发系列之Web组件的学习&#xff08;2.9&#xff09; 本篇内容&#xff1a;ArtTS语言基础类库-异步同步并发内容的学习(2.10.1&#xff09; 一、知识储备 1. 异常并发 Promise和Async/await提供异步并发能力&#xff0c;是标准的JS异步语法 Pr…

【王佩丰 Excel 基础教程】第一讲:认识Excel

文章目录 前言一、Excel软件简介1.1、历史上的其他数据处理软件与 Microsoft Excel1.2、Microsoft Excel 能做些什么1.3、Excel 界面介绍 二、Microsoft Excel 的一些重要概念2.1、Microsoft Excel 的几种常见文件类型2.2、工作簿、工作表、单元格. 三、使用小工具&#xff1a;…

基于Spring Boot的药房信息管理系统

1 项目介绍 1.1 研究的背景及意义 随着社会的飞速进步和药房行业竞争的白热化&#xff0c;传统的手工管理模式已难以适应药房信息管理的现代化需求。在计算机科学技术日臻完善的背景下&#xff0c;药房信息管理者们日益认识到运用计算机技术进行信息管理的迫切性和重要性。计…

黑马苍穹外卖8 Spring Task+WebSocket 来单提醒和客户催单

Spring Task Spring提供的任务调度工具&#xff0c;按照约定时间自动执行代码。【以前的都是基于请求(http)响应的】 cron表达式 通过cron表达式可以定义任务触发时间。 cron表达式生成器 &#xff08;1&#xff09;导入spring-context &#xff08;2&#xff09;EnableSc…

[OtterCTF 2018]Graphic‘s For The Weak

恶意软件的图形中有些可疑之处。 软件图形 &#xff1f;&#xff1f;&#xff1f;这里的恶意文件都是 vmware-tray.ex使用procdump转存进程的可执行文件 &#xff08;可执行的&#xff09;导出了 &#xff0c;看文件里面是否存在 图片 volatility.exe -f .\OtterCTF.vmem --pro…

Day38:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

Linux - 记一次某Java程序启动报错(申请内存失败)

文章目录 问题可能原因分析可能原因分析尝试各种解决方案尝试解决过程 解决办法&#xff1a; 调整 overcommit_meory参数overcommit_memory详解什么是 overcommit_memory&#xff1f;overcommit_memory 的选项及其含义配置 overcommit_memory查看当前设置设置 overcommit_memor…

# linux 系统中,使用 “ ll “ 命令报错 “ bash ll command not found “ 解决方法:

linux 系统中&#xff0c;使用 " ll " 命令报错 " bash ll command not found " 解决方法&#xff1a; 一、错误描述&#xff1a; 报错原因&#xff1a; 1、这个错误表明你尝试在 bash shell 中执行 ll 命令&#xff0c;但是系统找不到这个命令。ll 通常…

Nvidia显卡GeForce Experience录屏操作流程

安装软件 首先我们从英伟达官网下载GeForce Experience程序&#xff0c;安装在电脑中GeForce Experience&#xff08;简称 GFE&#xff09;自动更新驱动并优化游戏设置 | NVIDIA 登录软件 安装完成后登录 开启录屏功能 登录后点击右上角的设置&#xff08;小齿轮图标&#x…