ASN.1-PKCS10-x509

news2024/12/28 6:04:12

在国际标准ITU-T X.690 《Information technology – ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER)》中定义了ASN.1编码规则。对于一般数据类型(比如Integer、octetstring、bitstring等),ASN.1编码的一般形式如下图所示: 


         对于Boolean类型,标志位取值为1,DER编码规则使用0xFF表示Ture,BER编码规则可使用任意非0值表示True,它们都使用0表示False,不管取值是True还是False,值的长度都是1个字节。于是True的DER编码如下图:

 

  False的编码如下图:

 

ASN1采用一个个的数据块来描述整个数据结构,每个数据块都有四个部分组成:

1、数据块数据类型标识(一个字节)

数据类型包括简单类型和结构类型。

简单类型是不能再分解类型,如整型(INTERGER)、比特串(BIT STRING)、字节串(OCTET STRING)、对象标示符(OBJECT IDENTIFIER)、日期型(UTCTime)等。

结构类型是由简单类型和结构类型组合而成的,如顺序类型(SEQUENCE, SEQUENCE OF)、选择类型(CHOICE)、集合类型(SET)等。

l         顺序类型的数据块值由按给定顺序成员成员数据块值按照顺序组成,;

l         选择类型的数据块值由多个成员数据数据块类型中选择一个的数据块值;

l         集合数据块类型由成员数据块类型的一个或多个值构成。

这个标识字节的结构如下:

1.1.        Bit8-bit7

用来标示 TAG 类型,共有四种,分别是universal(00)、application(01)、context-specific(10)和private(11)。

这两位为universal(00)时,bit5-bit1的值表示不同的universal的值:

标记(TAG)   对应类型

[UNIVERSAL 1] BOOLEAN [有两个值:false或true]

[UNIVERSAL 2] INTEGER [整型值]

[UNIVERSAL 3] BIT STRING [0位或多位]

[UNIVERSAL 4] OCTET STRING [0字节或多字节]

[UNIVERSAL 5] NULL

[UNIVERSAL 6] OBJECT IDENTIFIER [相应于一个对象的独特标识数字]

[UNIVERSAL 7] OBJECT DESCRIPTOR  [一个对象的简称]

[UNIVERSAL 8] EXTERNAL, INSTANCE OF [ASN.1没有定义的数据类型]

[UNIVERSAL 9] REAL [实数值]

[UNIVERSAL 10] ENUMERATED [数值列表,这些数据每个都有独特的标识符,作为ASN.1定义数据类型的一部分]

[UNIVERSAL 12] UTF8String

[UNIVERSAL 13] RELATIVE-OID

[UNIVERSAL 16] SEQUENCE, SEQUENCE OF [有序数列,SEQUENCE里面的每个数值都可以是不同类型的,而SEQUENCE OF里是0个或多个类型相同的数据]

[UNIVERSAL 17] SET, SET OF [无序数列,SET里面的每个数值都可以是不同类型的,而SET OF里是0个或多个类型相同的数据]

[UNIVERSAL 18] NumericString [0-9以及空格]

[UNIVERSAL 19] PrintableString [A-Z、a-z、0-9、空格以及符号'()+,-./:=?]

[UNIVERSAL 20] TeletexString, T61String

[UNIVERSAL 21] VideotexString

[UNIVERSAL 22] IA5String

[UNIVERSAL 23] UTCTime [统一全球时间格式] (jaydon add ,比如 0x17)

[UNIVERSAL 24] GeneralizedTime

[UNIVERSAL 25] GraphicString

[UNIVERSAL 26] VisibleString, ISO646String

[UNIVERSAL 27] GeneralString

[UNIVERSAL 28] UniversalString

[UNIVERSAL 29] CHARACTER STRING

[UNIVERSAL 30] BMPString

[UNIVERSAL 31]... reserved for future use

1.2.        bit6

表示是否为结构类型(1位结构类型);0则表明编码类型是简单类型。

bit6为 0 不再解析

1.3.        bit5-bit1

是类型的TAG值。根据bit8-bit7的不同值有不同的含义,具体含义见上面的描述。

如 SEQUENCE 类型数据块,其TAG类型位UNIVERSAL(00),属于结构类型(1),TAG值为16(10000)所以其类型标示字段值为(00110000),即为0x30。

再如,证书扩展字段类型的数据块,TAG类型为(10),属结构类型(1),TAG的值为3(00011),所以其类型标示字段值为(10100011),即为0xA3

context-specific

这两位为context-specific(10)时,bit5-bit1的值表示特殊内容:

[0] –- 表示证书的版本 (add: A0 )

[1] –- issuerUniqueID,表示证书发行者的唯一id

[2] –- subjectUniqueID,表示证书主体的唯一id

[3] –- 表示证书的扩展字段 (add: A3 )

示例

0x30

二进制 :  0011 0000

Bit8 Bit7 是universal(00) 

Bit6 是1 为结构类型(1位结构类型)

Bit5-Bit1的值表示不同的universal的值: 0x1 0000 = 16  ,解析如下:

[UNIVERSAL 16] SEQUENCE, SEQUENCE OF [有序数列,SEQUENCE里面的每个数值都可以是不同类型的,而SEQUENCE OF里是0个或多个类型相同的数据]

0x02

二进制 :  0000 0010

Bit8 Bit7 是universal(00) 

Bit6 是0 为简单类型

Bit5-Bit1的值表示不同的universal的值: 0x0 0010 = 2  ,解析如下:

[UNIVERSAL 2] INTEGER [整型值]

0x31

二进制 :  0011 0001

Bit8 Bit7 是universal(00) 

Bit6 是1 为结构类型(1位结构类型)

Bit5-Bit1的值表示不同的universal的值: 0x1 0001 = 17  ,解析如下:

[UNIVERSAL 17] SET, SET OF [无序数列,SET里面的每个数值都可以是不同类型的,而SET OF里是0个或多个类型相同的数据]

0x06

二进制 :  0000 0110

Bit8 Bit7 是universal(00) 

Bit6 是0为简单类型

Bit5-Bit1的值表示不同的universal的值: 0x0 0110 = 6  ,解析如下:

[UNIVERSAL 6] OBJECT IDENTIFIER [相应于一个对象的独特标识数字]

0x13

二进制 :  0001 0011

Bit8 Bit7 是universal(00) 

Bit6 是0为简单类型

Bit5-Bit1的值表示不同的universal的值: 0x1 0011 =19  ,解析如下:

[UNIVERSAL 19] PrintableString [A-Z、a-z、0-9、空格以及符号'()+,-./:=?]

0x0C

二进制 :  0000 1100

Bit8 Bit7 是universal(00) 

Bit6 是0为简单类型

Bit5-Bit1的值表示不同的universal的值: 0x0 1100 =12,解析如下:

[UNIVERSAL 12] UTF8String

0x03

二进制 :  0000 0011

Bit8 Bit7 是universal(00) 

Bit6 是0 为简单类型

Bit5-Bit1的值表示不同的universal的值: 0x0 0011 = 3  ,解析如下:

 [UNIVERSAL 3] BIT STRING [0位或多位]

0xA0

二进制 :  1010 0000

Bit8 Bit7 是context-specific(10)

Bit6 是1 为结构类型(1位结构类型)

Bit5-Bit1  0 0000 解析如下:

Bit8 Bit7 是context-specific(10)时,bit5-bit1的值表示特殊内容

x509和csr中对于version的比较

x509中:

 

x509中 version是 包裹在Context[0]中的

 csr中:

 

 csr中version没有被context包裹

x509和csr中context的比较

x509中  A0是 version  , A1 是 issuerUniqueID , A2是 subjectUniqueID, A3是extensions

 

 

csr中:A0是 attributes  (可选的)

 

 

bistring类型的编码

以ECC证书中的签名值 和公钥为例:(前面都会多一个00)

 

 

bistring类型的编码方法:bistring类型的标志位取值为3。不包含任何比特的比特串被称为“空比特串”(empty bitstring)。其他比特串,例如对于“10101”这个比特串,其长度(即比特个数)为5,在这里将其表示为:{1,0,1,0,1}。考虑到比特串的长度不一定刚好是8的整数倍,而计算机中的最小存储单位是“字节”,一个字节包含8个比特,为了便于在计算机中表示比特串,对bitstring类型做ASN.1编码时,要做一些补位等额外的操作,按照以下步骤进行:
1) 补位;当比特串的长度不是8的整数倍时,要先对比特串进行补位。方法是在比特串的末尾添加比特 0,直到整个比特串的长度刚好是8的整数倍时停止。
2) 添加补位长度字节;将补位时添加的比特个数用一个字节表示,添加到补位结果比特串的前面。如果比特串的长度恰好是8的整数倍,此时未补位,那么此时必须在原始比特串前面添加一个0x0字节,以表示添加的补位比特个数为0。由此可知,补位长度这一个字节的取值范围为0到7。在进行过补位情况下(即原始比特串长度不是8的整数倍),补位长度字节和补位结果比特串共同组成了ASN.1  bitstring编码的负载部分;在未补位情况下(即原始比特串长度是8的整数倍),补位长度字节0和原始比特串共同组成了ASN.1  bitstring编码的负载部分。
3)编码。按照标志位、负载长度、负载的次序,进行编码。
对于比特串{1,0,1,0,1},编码过程如下图:

 

   对于空串(empty bitstring),其编码为:0x3  0x0
注意空串编码中仅包含标志位和负载长度,不包含负载部分。

        如果一个比特串中不包含比特1,例如 {0},该比特串仅包含一个比特0,其DER编码为:0x3  0x1  0x0
(实际上一个完全由比特0组成的比特串并无实际意义,一般用一个比特 {0} 来统一表示这一类的比特串)
        DER编码规则要求输入编码器的原始比特串的最后一个比特必须是1,即类似 {1, 0, 1, 0, 0} 这种以比特0作为结尾比特的比特串不是符合要求的编码器输入。而BER编码规则不要求输入编码器的原始比特串的最后一个比特必须为1,在编码前,甚至可以在一个比特串的末尾再添加任意个比特0。例如:在应用BER编码规则时,{1. 0, 1} 可以编码为以下不同的形式:
0x3  0x2  0x5  0xA0
0x3  0x3  0x5  0xA0  0x0
0x3  0x4  0x5  0xA0  0x0  0x0
0x3  0x5  0x5  0xA0  0x0  0x0  0x0
.......

        使用BER编码规则时,对同一个对象编码,其编码结果可以是不唯一的。而使用DER编码规则时,对同一对象编码,其编码结果一定是唯一的。在实际应用中,大多数情况下都使用DER编码。

到这里也就可以理解,签名结果(或者公钥)的比特串(不是字节串)肯定是8的倍数,因此不需要补位,即补位长度字节使0x00, 以表示添加的补位比特个数为0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件工程】自动化测试保证卓越软件工程能力(2)

本次内容我们抽象一个待测试的目标软件产品,产品是基于web开发的。 自动化平台不是独立存在的,必然有一个目标待测试产品,用自动化测试来反映产品功能是否还是好的。 产品抽象v1 第一个版本,使用者(USER)发…

配置本地Angular环境并使用VsCode调试Angular前端项目

配置本地Angular环境并使用VsCode调试Angular前端项目 配置本地Angular环境部署Node.Js本地环境配置一下环境变量 使用vscode调试Angular安装vscode 配置本地Angular环境 部署Node.Js本地环境 1 从官网下载node.js, 本文为(v16.13.0) 下载地址: https://nodejs.org/dist/v16.…

windows server 2016报错无法打开所需文件install.wim

报错的前提条件: 1.下载原版镜像后,使用UltraISO制作U盘系统盘。 2.正常安装系统,到“安装程序正在启动界面”时弹出错误窗口,报错“Windows无法打开所需的文件 E:\Source\install.win。请确保安装所需的所有文件可用,并重新启动安装。错误代码:0x80070026”。 问题原因…

【MySQL学习】MySQL表的复合查询

文章目录 前言一、案例准备二、基本查询三、多表查询四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 FROM子句中的子查询4.5 合并查询4.5.1 UNION4.5.2 UNION ALL 五、自连接六、内外连接6.1 内连接6.2 外连接6.2.1 左外连接6.2.2 右外连接 前言 对MySQL表的基本查…

大数据系列——Flink理论

概述 Flink是一个对有界和无界数据流进行有状态计算的分布式处理引擎和框架,既可以处理有界的批量数据集,也可以处理无界的实时流数据,为批处理和流处理提供了统一编程模型,其代码主要由 Java 实现,部分代码由 Scala实…

Java——Java选择题复习(1)(Java基础,进程,多线程,操作系统)

1. 下面关于程序编译说法正确的是() A. java语言是编译型语言,会把java程序编译成二进制机器指令直接运行 B. java编译出来的目标文件与具体操作系统有关 C. java在运行时才进行翻译指令 D. java编译出来的目标文件,可以运行在任意…

房地产中介迎来重磅文件,但核心目标仍是专业化规范化发展

5月8日下午,住房和城乡建设部、市场监管总局联合刊登重磅文件《关于规范房地产经纪服务的意见》(以下简称《意见》),因其涉及对经纪服务收费等具体问题的指导,文件引发市场重点关注。 不过,在系统性梳理文…

Redisson cannot use an unresolved DNS server address问题解决

概述 本文记录Mac IDEA开发,公司 远程办公时遇到的两个问题,记录一下。 问题 cannot use an unresolved DNS server address: [fe80::1%en0]:53 在家里,连上公司的VPN后,即可打开公司内网,远程办公。一切正常。某…

JVM学习(七):运行时数据区(精讲)

目录 一、运行时数据区概述 1.1 概述 1.2 运行时数据区中的GC和OOM 二、程序计数器(PC寄存器,Program Counter Register) 2.1 介绍 2.2 作用 2.3 特点 2.4 使用案例 2.5 常见面试题 三、虚拟机栈(Java Virtual Machi…

前端008_类别模块_新增功能

类别模块_新增功能 1、需求分析2、新增窗口实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 点击 新增 按钮后,对话框形式弹出新增窗口输入分类信息后,点击 确定 提交表单数…

IDEA小技巧-Git的回滚强推代码找回

标题IDEA小技巧-Git的回滚&&强推&&代码找回 本地未Commit 新增文件 delete 变更文件 rollback 第一种方式 第二种方式 切换默认变更列表 Commit未push undo commit 仅适用于最后一次的提交进行回滚 drop commit 回滚 revert commit revert commi…

Winform从入门到精通(42)——ToolStripContainer(史上最全)

该控件提供了一个上、下、左、右、中,一共五个面板 在界面添加toolStrip1,如下图: 在界面添加toolStrip2,如下图: 在界面添加toolStrip3,如下图: 在界面添加toolStrip4,如下图: 整体效果如下: 这里没有先将ToolStripContainer放到窗体上,这是因为经过测试发现…

FFmpeg 安装和使用

首先下载 ffmpeg: https://www.gyan.dev/ffmpeg/builds/ 点击下载 截至到 2023/5/9 FFmpeg的最新版是 6.0 版本的,如果想要下载之前版本的也可以,我这里就下载6.0版本的了 下载完之后解压缩,进入 bin 目录就是 FFmpeg 的主体…

shell脚本中数组的运用

shell脚本中数组的运用 一、数组的介绍1、概念2、定义方法3、数组包括的数据类型 二、关于数组的操作1、获取数组长度2、获取数组各个元素的下标3、获取数组列表或单个元素4、对数组切片输出5、对数组里的元素替换6、删除单个元素或数组7、数组追加元素8、向函数传入数组的值 三…

基于遗传算法优化的核极限学习机(KELM)分类算法-附代码

基于遗传算法优化的核极限学习机(KELM)分类算法 文章目录 基于遗传算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于遗传算法优化的KELM4.测试结果5.Matlab代码 摘要:本文利用遗传算法对核极限学习机(KELM)进行优化,并用于分类 1.KE…

orin Ubuntu 20.04 配置 Realsense-ROS

librealsense安装 sudo apt-get install libudev-dev pkg-config libgtk-3-dev sudo apt-get install libusb-1.0-0-dev pkg-config sudo apt-get install libglfw3-dev sudo apt-get install libssl-dev sudo apt-get install ros-noetic-ddynamic-reconfiguresudo apt-key a…

iphone死机屏幕没反应?可以用这2种办法解决!

iPhone用的时间长了,难免不会遇到卡屏、死机的情况,如果出现这种状况我们应该怎么办呢,下面小编整理出来了几招解决方法,教大家解决iPhone卡屏、死机的问题。 一、强制重启 如果自己的iPhone一直处于卡屏无法操作,或死…

2023年电梯行业研究报告

第一章 行业概况 电梯行业是指制造、销售、安装、维护和升级电梯及相关设备的产业。电梯行业是一个不断发展的行业,主要因为人们对更高层建筑的需求越来越大,以及城市化进程的加速,从而需要更多的垂直交通设施。电梯行业在世界各地都有很好的…

64.网页设计规则#8_用户体验设计(UX)

什么是用户体验(UX)? “Design is not just what it looks like and feels like. Design is how it works” ——Steve Jobs “设计不仅仅是外观和体验。设计更重要的是其工作原理。”——史蒂夫乔布斯 UI 和 UX设计 ● UI 是图形界面:UI 设计使界面更加美观。 …

MySQL 5.7.31 安装教程

前言 MySQL 5.7.31 是5.x系列最后一版 支持全平台(包含 MacOS)的版本 下载 1.首先下载安装支持包 vc_redist.x64.exe 安装完重启使包生效 2.选择你需要的 MySQL 版本下载,我们用 5.7.31 的 这是 MySQl 的压缩包,解压就能用&a…