ASN.1 常用类型 编码详解 入门

2023-11-16

编码结构

下面说明的均为primitive类型,constructed类型不做讨论。

BER – Basic encoding rules 基础编码规则

组成部分:

  1. 标识符(Identifier)
  2. 长度(Length)
  3. 内容(Contents)

编码结构如下图所示:
组成部分

标识符 Identifier

标识符就是表示这个数据结构的类型。

标识符占用 1 字节(byte)

标识符结构如下:
标识符结构

标识符字节各位(bit)详解:

  1. 第8 - 7位表示这个标签的类别。类别如Table 1所示,一般情况下使用Universal类型,就是00
  2. 第6位
    • 0 表示primitive标签类型:基本数据类型(不可拆分)
    • 1 表示constructed标签类型:复合数据类型(可拆分)
  3. 第5 - 1位表示为一个无符号数字,这个数字为这个标签的类型数字。这个数字的最高有效为第5位。

标签类型

此处所描述的结构只适用于类型小于30种的定义,如果类型超过30就需要使用 high tag number方式的数据结构,此处不做描述。

长度 Length

长度就是表示Contents字节数量。

长度的结构有两种构成方式,按照Content实际的长度(字节数量)来划分:

  • 短形式,Contents长度小于等于 (<=) 127。
  • 长形式,Contents长度大于 (>) 127。

短形式

Contents长度小于等于 (<=) 127

长度占用 1 字节(byte)

短形式结构

短形式字节各位(bit)详解:

  1. 第8位固定值0
  2. 第7 - 1位表示一个无符号数字,表示Contents中字节数量,其中最高有效位为第7位。(该数字可能为0)

示例:

Length = 38 二进制编码为 0010 0110

长形式

Contents长度大于 127。

长形式的长度由一个或多个子字节构成。
在这里插入图片描述

长形式详解:

  1. 第1子字节
    • 第8位固定值1
    • 第7 - 1 位表示一个无符号数字,表示长度的子字节的数量,其中最高有效位为第7位。
    • 第一个字节不允许出现 1111 1111的情况。
  2. 第1子字节之后的字节,表示一个无符号数字,表示Contents中字节数量,其中最高有效位为第1子字节之后的第一个字节的第8 位。

示例:

Length = 201 二进制编码为

1000 0001
1100 1001

内容 Contents

Contents表就是这个数据结构所要表示的值。它由0到多个字节构成,内容的值应该按照对应类型进行对应的编码。

基本类型

布尔类型 BOOLEAN

标识符为:0x01

固定长度:1 (字节)

FALSE - 单字节中所有位为0,0x00

TRUE - 单字节中所有位为1,0xFF

示例:

TRUE的布尔值编码为:
TRUE的布尔值编码

整形 INTEGER

标识符为:0x02

整形类型的Contents由0到多个字节构成。

如果整形的值(Contents中的内容)编码数量超过一个字节,那么值的第1个字节(byte)和第二个字节的第8位(bit)应该是下面情况:

  • 两者都不应全为1
  • 两者都不应全为0

整形类型的Contents中的字节因为所表示数字的二进制 补码 表示。

正数的补码:等于本身。

如: 1 - 0000 0001 的补码为 0000 0001

负数的补码:符号位不变,其它位按位取反,最后再加1

如: -1 - 1000 0001 的补码为 1111 1111

示例

-1 可以表示为:
-1
128 可以表示为:
128

如果数字的第1bit为1,通常会在编码前补上一个0字节(byte),也就是0x00,例如:数字128的编码如下:

Integer value BER encoding
0 02 01 00
127 02 01 7F
128 02 02 00 80
256 02 02 01 00
-128 02 01 80
-129 02 02 FF 7F

实数 REAL

标识符为:0x09

如果实数为0,那么这个标签不含有Contents部分。

如果实数非0,那么Contents的第一个字节编码规则如下:

  • bit 8 = 1(第8位),规则为二进制编码参照的 二进制的编码
  • bit 8 = 1 并且 bit 7 = 0,规则为十进制类型编码参照 十进制的编码
  • bit 8 = 1 并且 bit 7 = 1,规则为特殊实数编码参照 特殊实数编码

枚举类型 ENUMERATED

标识符为: 0x0a

枚举类型的编码与整形(Integer)一致。

感谢 其实我是真性情 指正

二进制的编码

Contents的第一个字节的bit 8 = 1,如果实数非0:
设:

  • 要表示的数字编码(尾码)为M
  • 符号位为S
  • 正整数数值N
  • 二进制系数F (位数)

M的计算方式如下:

二进制编码规则

有时需要调整系数F以便使得尾码达到编码对齐规则。

实数的二进制编码
Contents第一个字节编码规则:

  1. bit 8 固定值1
  2. bit 7
    • S为-1时为1
    • S为+1时为0
  3. bit 6 - 5 代表基于什么进制,如 Table 2 所示。
  4. bit 4 - 3 表示二进制系数F
  5. bit 2 - 1 指定指数编码的规则:
    • 00 表示Contents的第2个字节为指数的补码。
    • 01 表示Contents的第2、3字节为指数的补码。
    • 10 表示Contents的第2、3、4字节为指数的补码。
    • 11 表示Contents的第2字节为编码(指数的补码)的长度(字节数),它是一个无符号的二进制数字,设编码长度为X。那么从第3 到X + 3字节为指数的补码。X的值至少为1,指数的前9位不能全为01

表2
除去上述描述的字节之后,Contents剩余的所有字节用于表示整数N的无符号二进制编码。

十进制的编码

Contents的第一个字节的bit 8 to 7 为00Contents中除第一个字节之外的所有内容构成一个Field

Field《ISO 6093》 有具体描述,包括长度和编码。

Contents的第一个字节的bit 6 到 1位有以下可选值:
第1字节剩余未可选值

特殊实数编码

Contents的第一个字节的bit 8 to 7 为01,那么Contents仅有一个字节,它的值可以使下表
特殊值

比特串 BIT STRING

标识符为:0x03
比特串结构
比特串的Contents包含一个初始(Initial)字节,它的后面接上0到多个字节。

比特串所表示的值,按照比特串的顺序,从头到尾,每个8bit作为一个字节,依次排列,最后一组不足8位,就补0以达到一个字节。

示例
序列化

Contents中的初始字节,是一个无符号的二进制编码的数,最低有效位为第1位。用来表示最后一个字节中补0的数量。初始化字节的范围为:[0, 7]。

如果 字节串为空,那么不应该有任何子字节,初始化字节为0。

结构示例:

比特串 0x0A3B5F291CD 的二进制编码为:

比特串表示

Contents第一个字节的0x04表示补充了4个零。

字节串 OCTET STRING

标识符为:0x04

字节串在Contents中按照字节串的值的原始顺序,使用0或多个字节,来表示字节串的值。

示例:

字节串 0x00B701 二进制编码为:
字节串编码示例

空值 NULL

标识符为:0x05

空值Contents不含任何字节,它的长度(Length)为0。

示例

空值NULL的二进制编码可以表示为:
空值二进制编码

序列 SEQUENCE

标识符为:0x30

序列的Contents中包含,除了使用OPTIONAL或DEFAULT类型修饰的关键字之外,序列中含有每一个子项的ASN.1的完整编码,并且按照它们原先在序列中的顺序出现。

如果使用OPTIONAL或DEFAULT类型修饰的关键字的值存在,那么在Contents中它们应该出现它们的原本的位置上。

示例:

序列定义为:

SEQUENCE {
	age				INTEGER,
	ok				BOOLEAN
}

值为:

{
	age				18,
	ok				TRUE
}

对应的二进制编码为:
序列示例

数组 SEQUENCE-OF

标识符为:0x30

数组中的元素ASN.1类型都是同种类型的。

数组的Contents中包含0到多个定义好的的ASN.1值的完整编码,并且按照它们原先在序列中的顺序出现。

示例

BOOLEAN类型的数组定义:

 SEQUENCE OF BOOLEAN

值为:

{
	TRUE, FALSE, TRUE
}

对应的二进制编码为:

SEQUENCE-OF 二进制编码

集合 SET

标识符为:0x31

集合的Contents中包含,除了使用OPTIONAL或DEFAULT类型修饰的关键字之外,序列中含有每一个子项的ASN.1的完整编码,并且按照它们原先在序列中的顺序出现。

示例

集合的值为:

{
	TRUE, 
	777,
	0x01020304 --bitString
}

对应的二进制编码为:
Set 二进制编码

SET-OF

标识符为:0x31

SET-OF 基本与 “数组 SEQUENCE-OF ” 一致,在此不做描述。

选择 CHOISE

标识符为:无

选择类型中表示的字段中,该字段可能有多重不同的类型来表示。

选择类型的编码应该与所选中的值的编码相同。

示例

定义一个名为parameter 选择为

parameter CHOISE {
	integerType 				INTEGER,
	booleanType				BOOLEAN
}

parameter 的值为

parameter  booleanType TRUE

对应的二进制编码为:
选择类型编码示例

结束

本次介绍的是常用的ASN.1编码的入门。

这没有对所有的ASN.1类型进行解释,上述描述的基本都是ASN.1的基础类型,其他类型基本上都是上述类型的不同Contents编码规则。

更多细则和定义请参考 《ITU X.680》***、***《ITU X.690》

参考文献

[1] ITU .X.680 . Abstract Syntax Notation One (ASN.1): Specification of basic notation [S] . 2015-08

[2] ITU .X.690 . ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER) [S] . 2015-08

[3] bj-sys . https://www.obj-sys.com/asn1tutorial/node10.html
[4]. ASN.1 语法・一 . mingfer . https://www.mingfer.cn/2019/04/05/ASN1%E6%8A%BD%E8%B1%A1%E8%AF%AD%E6%B3%95/
[5]. ASN.1 语法・二 . mingfer . https://www.mingfer.cn/2019/04/05/ASN1%E6%8A%BD%E8%B1%A1%E8%AF%AD%E6%B3%95/
[6]. X.690 . wikipedia . https://en.wikipedia.org/wiki/X.690
[7]. A Layman’s Guide to a Subset of ASN.1, BER, and DER . Burton S. Kaliski Jr . 1993 . http://luca.ntop.org/Teaching/Appunti/asn1.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASN.1 常用类型 编码详解 入门 的相关文章

  • [C-SAE] MAP消息解析及格式说明

    1 消息内容
  • OpenSSL中文手册之ASN1库详解(未完待续)

    openssl之ASN 1系列之1 引言和ASN 1概述 引言 ASN 1全称为Abstract Syntax NotationOne 是一种描述数字对象的方法和标准 openssl的编码方法就是基于该标准的 目前 很多其他软件的编码方法也
  • ASN.1语法以及在python中如何编码解码

    ASN 1的文章本来是免费的 但是有的人一定要搞小动作 咱惹不起就只能躲着了 做了一些修改后 改为付费文章 应用程序在网络协议的应用层对payload数据 多使用ASN 1标准进行处理 ASN 1 ASN 1 Abstract Syntax
  • 从公钥正确创建 RSACryptoServiceProvider

    我目前正在尝试创建一个RSACryptoServiceProvider仅来自解码的 PEM 文件的对象 经过几天的搜索 我确实设法找到了一个可行的解决方案 但它还不是一个可以投入生产的解决方案 简而言之 为了创建一个RSACryptoSer
  • 解析 EMV 事务中 GET PROCESSING OPTIONS 命令的 PDOL

    我正在尝试构建一个格式正确的 GET PROCESSING OPTIONS 命令以发送到非接触式 EMV 卡 这个帖子非常有帮助 但我只需要了解更多细节 解析 PDOL 时 是否可以安全地假设每个标签的长度为 2 个字节 后跟预期返回的数据
  • Ruby OpenSSL 嵌套 asn1 错误

    我已经尝试过针对此处发布的几个问题的建议 但无济于事 我有以下文件 注意 我即时生成了这些文件 它们是一次性密钥 证书文件 BEGIN CERTIFICATE MIIE jCCA KgAwIBAgIJAMLMeL HH75vMA0GCSqG
  • 将 XML Dsig 格式转换为 DER ASN.1 公钥

    我正在开发一个 iPhone 应用程序 它从 ASP NET Web 服务中检索 RSA 公钥 格式如下
  • 使用 go 结构进行 ASN.1 解组会出现标签不匹配错误

    我正在尝试对以下定义执行 ASN 1 marshal unmarshal 操作 ACEI SEQUENCE message MessageFields neRegNumber OCTET STRING OPTIONAL gpsInfo Gp
  • X.509 证书中的专有名称长度限制

    在通用名称字段中 如 OID 2 5 4 3 的 ASN 1 表示法中所定义 限制最多为 64 个字符 如果我们想要一个超过 64 个字符的通用名 有什么办法吗 即使你可以哄骗你的证书生成代码拥有更长的 CN 它也是clients这需要改变
  • ASN.1 编译器错误标记“SYNTAX”意外

    我目前正在尝试编译 ASN 1 代码片段 它看起来如下 RFC1213 MIB DEFINITIONS BEGIN IMPORTS experimental FROM RFC1155 SMI OBJECT TYPE FROM RFC 121
  • ASN.1 DER 格式的私钥

    为什么模数要用前导零填充 我正在阅读 PKCS 1 和 PKCS 8 但没有找到任何相关内容 在 C 中 必须删除前导零 有人知道为什么吗 At http etherhack co uk asymmetry docs rsa key bre
  • X.509v3 ASN.1 到 C 数据结构

    我正在尝试创建代理证书的 X509 请求 ProxyCertInfo 扩展RFC3820 http www ietf org rfc rfc3820 txt 在 C OpenSSL 中 但我无法弄清楚应该如何定义 ProxyCertInfo
  • OpenSSL ASN.1 编程教程

    我正在寻找有关使用 OpenSSL 库进行 ASN 1 DER 编码的任何 C C 教程 示例代码或文档 好吧 正如您在 openssl 网站上看到的那样 没有 ASN 1 函数的官方文档 但你总是可以下载 openssl 源 http o
  • 如何从.key和.crt文件获取.pem文件?

    如何从 SSL 证书创建 PEM 文件 这些是我可用的文件 crt server csr server key 您的密钥可能已经是 PEM 格式 但只是以 crt 或 key 命名 如果文件的内容开头为 BEGIN您可以在文本编辑器中阅读它
  • 在 C# 中创建 ASN1 编码签名以发送到 Java

    我有一个私人 公共安全证书 我的 Java 同行拥有公钥 我需要获取一个字符串 对其进行签名 然后将其发送到 Java 然后验证数据和签名 微软和世界其他地方如何编码 签名数据似乎存在一个众所周知的问题 即有关字节处理方式的问题 这是众所周
  • ASN1_TIME 到 time_t 转换

    我怎样才能转换ASN1 TIME to time t格式 我想转换返回值X509 get notAfter 到秒 从 openssl 代码来看 这似乎是一个坏主意 FIXME mktime assumes the current timez
  • 如何解码非关键ASN1数据?

    是否可以使用 crypto 库来解码字节数组中的任意 ASN1 数据 其中有几个序列和整数 ash h 包含所有以 BufferedTransformation 作为输入的方法 但该类是不同密码和哈希的接口 这似乎与我的简单情况根本无关 我
  • 为什么 Symantec CSR 检查程序认为我的 CSR 在 AlgorithmIdentifier 中缺少 NULL 值? RFC3279

    由于许多令人不快的原因 我一直在尝试使用 bouncycastle API 手动构建自己的证书签名请求 表面上 我选择这样做是因为我需要 CSR 的预签名版本 以便使用存储在 HSM 中并在 LMK 下加密的密钥生成 sha256withR
  • 关于如何将 JSON 消息转换为 ASN.1 的想法

    我正在尝试将 JSON 消息转换为 ASN 1 我的目标是将 JSON 从wire shark 捕获 转换为 ASN 1 然后将 asn1 转换为 802 11p 我应该研究哪些想法或资源 我正在使用Python 3 7 您可以使用此工具将
  • 验证使用 BER/DER 编码的 ASN.1 格式的 C# 中的 DSA 签名

    如何在 C 中验证 DSA 签名 Given 消息文本 签名摘要 通常为 ASN 1 DER 格式 公钥 采用签名的 X 509 证书 PEM 或 DER 格式 我尝试了多种方法 但都没有成功 OpenSSL NET http openss

随机推荐

  • Visual Studio连接Linux服务器编译CMake项目,生成在Linux上运行的程序

    本文基于的开发环境说明 window系统 Windows 10 企业版 64位操作系统 Linux系统 BigCloud Enterprise Linux 7 8 Core Visual Studio Microsoft Visual St
  • eclipse中设置jsp文件的默认编码格式为utf-8

    eclipse中设置jsp文件的默认编码格式为utf 8 我们在创建jsp文件时 经常遇到生成的jsp文件中的编码格式默认为iso 8859 1 这样的编码由于不支持中文 所以我们需要手动把它改为utf 8编码 这样会浪费我们很多时间 所以
  • 神经网络学习小记录74——Pytorch 设置随机种子Seed来保证训练结果唯一

    神经网络学习小记录74 Pytorch 设置随机种子Seed来保证训练结果唯一 学习前言 为什么每次训练结果不同 什么是随机种子 训练中设置随机种子 学习前言 好多同学每次训练结果不同 最大的指标可能会差到3 4 这样 这是因为随机种子没有
  • Windows+WSL2+SSH实现远程办公

    Windows11 WSL SSH实现远程办公 Windows11 WSL2 SSH实现远程办公 主机配置 远程启动PC 设置DMZ主机 下载WSL 设置WSL为终端默认Shell和SSH自动启动 设置Windows和Ubuntu中SSH的
  • Ubuntu18.04 离线安装gcc,g++,make依赖包

    1 离线安装背景 因为项目现场的服务器无法连接互联网 只有内网环境 但是需要安装redis和nginx 所以需要安装gcc g make等依赖包 2 如何获取依赖包 需要准备一台可以连接互联网的电脑 如 个人电脑上的虚拟机安装一个与服务器一
  • jeecg excel 导入到java

    TSAttachment tsAttachment systemService getEntity TSAttachment class ttachementId 获得excel List
  • 2019最近计算机毕业设计-题目汇总大全-系列3

    课题名称 备注 初等数学类人答题中的读文作图理论研究及应用 数字图像加密关键技术研究与实现 FitzHuge Nagumo 模型及其在图像处理中的应用 基于图形硬件加速的实时布料动画系统设计与实现 基于GAN的人脸图像生成 基于智能视觉理解
  • jetson装jtop

    问题与背景 可以进行远程操作之后 ssh和ui 就可以进行控制台指令 ui界面 文件上传下发的基本操作了 但是jetson毕竟是体积小 所能承载的硬件性能有限制 在程序调试与开发的过程中 还是希望监控一下设备的性能情况 包括cpu gpu
  • VS2013+openCV2.4.10环境配置

    一 openCV环境配置步骤 1 下载opencv 2 4 10到任意文件夹 然后解压 配置环境变量PATH F opencv opencv build x86 vc12 bin 按你自己存放的地址 opencv 2 4 10下载链接 ht
  • Android中so使用知识和问题总结以及插件开发过程中加载so的方案解析

    转自 https blog csdn net jiangwei0910410003 article details 52312451 一 前言 Android中有时候为了效率以及平台开发库的支持 难免会用到NDK开发 那么都会产生一个so文
  • Java之StringUtils的常用方法

    StringUtils 方法的操作对象是 Java lang String 类型的对象 是 JDK 提供的 String 类型操作方法的补充 并且是 null 安全的 即如果输入参数 String 为 null 则不会抛出 NullPoin
  • Unittest自动化测试框架vs Pytest自动化测试框架

    引言 前面一篇文章Python单元测试框架介绍已经介绍了python单元测试框架 大家平时经常使用的是unittest 因为它比较基础 并且可以进行二次开发 如果你的开发水平很高 集成开发自动化测试平台也是可以的 而这篇文章主要讲unitt
  • Postman实现数据驱动---一个简单的登录案例

    我理解的数据驱动就是把一个请求中要传入的值设置为变量 比如一个登录的接口 请求在发送的时候要填入用户名 密码等一些信息 用户名和密码的值有很多种组合 设置为变量就会非常方便 话不多说 直接看例子 在登录界面 抓包登录请求 可以看到登录时需要
  • 计算机不在同一个网络,电脑设置ip地址提示默认网关不在由ip地址和子网掩码定义的同一网络段上怎么办...

    最近有用户要对电脑ip地址进行设置的时候 却弹出窗口 提示默认网关不在由ip地址和子网掩码定义的同一网络段上 这该怎么办呢 通常网关与主机IP应该在同一网段 否则无法通信 可能是配置有问题 下文告诉大家具体解决方法 默认网关不在由ip地址和
  • FFMpeg 实现视频编码、解码

    FFMpeg 作为音视频领域的开源工具 它几乎可以实现所有针对音视频的处理 本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例 编码 解码 封装 解封装 转码 缩放以及添加水印 接下来会由发现问题 分析问题 解决问题
  • 如何成为一名合格的前端开发者?

    个人 懂得都懂 我觉得会 Ctrl C 和 Ctrl V 才是合格 这是对老板讲的 一 JavaScript基础 前端工程师吃饭的家伙 深度 广度一样都不能差 变量和类型 1 JavaScript规定了几种语言类型 2 JavaScript
  • k8s系统获取真实客户端ip

    k8s部署 系统获取真实客户端ip 我们生产中使用的是kong网关环境的架构也不同 第一种kong网管后走nginx 第二种kong网管后不走nginx kong网管后走ingress nginx 修改kong的配置 配置要信任的原始IP地
  • 使用python做手机app后台

    编辑器 HBuiderX PyCharm 主要技术 5 App python HBuiderX 下载地址 http www dcloud io hbuilderx html PyCharm 下载地址 http www jetbrains c
  • 如何在html里写css类选择器,关于html:如何在CSS选择器中排除特定的类名?

    当用户鼠标将鼠标悬停在类名称为 reMode hover 的元素上时 我尝试应用背景色 但是如果元素也有 reMode selected 我不想更改颜色 注意 因为我在某种有限的环境中工作 所以只能使用CSS而不是JavaScript 为了
  • ASN.1 常用类型 编码详解 入门

    文章目录 编码结构 标识符 Identifier 长度 Length 短形式 长形式 内容 Contents 基本类型 布尔类型 BOOLEAN 整形 INTEGER 实数 REAL 枚举类型 ENUMERATED 二进制的编码 十进制的编