ASN.1编码方式详解

2023-11-12

ASN

ASN.1 – Abstract Syntax Notation dot one,抽象记法1。数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为ASN.2等,但至今也没有出现。

描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。

基本语法规则

  • 在ASN.1中,符号的定义没有先后次序:只要能够找到该符号的定义即可,而不必关心在使用它之前是否被定义过。
  • 所有的标识符、参考、关键字都要以一个字母开头,后接字母(大、小写都可以)、数字或者连字符“-”。不能出现下划线“_”。不能以连字符“-”结尾,不能出现两个连字符(注释格式)。
  • 关键字一般都是全部大写的,除了一些字符串类型(如PrintableString,UTF8String,等。因为这些都是由原类型OCTET STRING衍生出来的)。
  • 在标识符中,只有类型和模块名字是以大写字母开头的,其它标识符都是以小写字母开头的。
  • 带小数点的小数形式不能在ASN.1中直接使用,在ASN.1中实数实际定义为三个整数:尾数、基数和指数
  • 注释以两个连字符“--”开始,结束于行的结尾或者该行中另一个双连字符。
  • 如同大多数计算机语言,ASN.1不对空格、制表符、换行符和注释做翻译。但是在定义符号(或者分配符号Assignment)“::=”中不能有分隔符,否则不能正确处理。

类型定义与类型

  1. ::=

​ 其中:

是一个以大写字母开头的标识符;

​ 是基于内建类型或在其它地方定义的类型。

  1. 值定义: ::=

其中:

是以小写字母开头的标识符;

可以是一个类型的名字,也可以是类型描述;

值描述>是基于整数、字符串、标识符的组合。

  • ASN.1的编码格式有很多种: BER、CER、DER、XER,可以编码成XML格式,不仅仅是常用的二进制流。BER、CER、DER,是ASN.1的三种最常用的编码格式
CER、DER、CRT、PEM的关系
  • 所有X.509都是DER编码,DER是指ASN.1的编码规则,.der证书文件一般是二进制文件。

  • CER可用于PKCS#7证书(p7b)的编码,但一般是指证书的文件后缀,.cer证书可以是纯BASE64文件或二进制文件。
  • PEM通常也是指文件的后缀,为内容使用BASE64编码且带头带尾的特定格式,二进制的文件不应该命名为pem。
  • CRT是微软的证书后缀名,和.CER是一回事。

微软的CryptAPI很强大,证书的各种格式都可以识别,比如纯BASE64编码的、标准PEM格式的、非标识PEM格式的(不是64字节换行、没有头尾等)、二进制格式的

BER编码

描述了如何将ASN.1 类型的值编码成字节串的方法。BER的语法传输格式一直是TLV三元组<Type, Length,Value>

  • tag(标志域): 指明数据类型,占用一个字节常见的类型有
BER_TYPE_BOOLEAN    0x01
BER_TYPE_INTEGER    0x02
BER_TYPE_BIT_STRING 0x03
BER_TYPE_OCTET_STRING   0x04
BER_TYPE_NULL   0x05
BER_TYPE_OID    0x06
BER_TYPE_SEQUENCE   0x30
BER_TYPE_SNMP_SET   0xA3
  • 长度域(length):指明值域的长度,长度不等,一般为一到三个字节。其格式可分为短格式(后面的值域长度<=127),长格式.

(1)定长方式

  • 短格式 berShort.png

length=30 表示为1E(16进制),30长度域为 0001 1110 没有超过127;

  • 长格式 :表示方法为1(bit)K(7bit)K个八位长度(K Byte)

berLength.png

length = 169 转换为 81 A9(169长度超过127,长度域为1000 0001 1010 1001;169是后8位的值,前8位的第一个1表示这是一个长格式的表示方法,前8位的后7位表示后面有多少个字节表示针对的长度000 0001后面有一个字节表示真正的长度 1010 1001是表示长度为169)

​ length=1500=>82 05 DC(1000 0010 0000 0101 1101 1100,先看第一个字节,表示长格式,后面有2 个字节表示长度,这两个字节是0000 0101 1101 1100 表示1500)

(2).不定长方式

Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。

Length所在八位组固定编码为0x80,但在Value编码结束后以两个0x00结尾。这种方式使得可以在编码没有完全结束的情况下,可以先发送部分消息给对方。

定长.png

  • 值域(value)

  • 整型Integer的编码 integer::=0x02 length{byte} (表示重复),最高位代表符号位,去掉多余的0。对于正数,如果最高比特位为0则直接编码;如果为1,则在最高比特位之前增加一个全0的八位组。

    • 最高位为0:0BBBBBBB

    • 最高位为1:00000000|1BBBBBBB

  1. 例: 对于负数,先取绝对值进行编码,再取反,最后加1
1500=>02 02 05 DC 
40000=>02 03 00 9C 40
-129=>129=>0000 0000 1000 0001->1111 1111 0111 1110 ->(加1)->FF 7F 最终为02 02 FF 7F
  • 布尔值的编码由1个字节组成。FALSE为00; TRUE为FF。

    • TRUE的编码: 01 01 FF
    • FALSE 的编码: 01 01 00
  • 字符串类型的编码 string::=0x04 length{byte}* 例如:04 06 70 75 62 6c 69 63表示字符串public

  • 位串(BITSTRING)类型 :编码规则:位串的第一位放到第一个负载字节的第8位;位串的第二位放到第一个负载字节的第7位; 依此类推.填充满第一个负载字节,就继续填充第二个负载字节.如果最后一个负载字节未被填充满,空的位用0来填充, 0的个数存放到头部用来表示填充数据的那个字节里.

位串{1,0,0,0,1,1,1,0,1,0,0,1}
开始填充负载字节.第一个字节填充后为10001110= 0x8E; 第 二个字节填充后为10010000 = 0x90, 低位4个0为填充的空位.则,负载为2个字节加上表示填充0个数的一个字节0x04总共3个字节.则完整的编码为:0x03 03 04 8E 90.

  • 空类型的编码 null::=0x05 0x00

  • objectID::=0x06 length {subidentifier}*

  • 首两个ID被合并为一个字节X*40+Y

  • 每个字首先被分割为最少数量的没有头零数字的7位数字.这些数字以big-endian格式进行组织,并且一个接一个地组合成字节.

举例: 30331 = 1* 128^2 + 108 * 128 + 123 分割成7位数字(0x80)后为{1,108,123}
  • 除了编码的最后一个字节外,其他所有字节的最高位(位8)都为1.
设置最高位后变成{129,236,123}.如果该字只有一个7位数字,那么最高为0 
MD5 OID的编码:
1. 将1.2.840.113549.2.5转换成字数组 {42, 840, 113549, 2, 5}.
2.然后将每个字分割为带有最高位的7位数字,{{0x2A},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}
3. 最后完整的编码为 0x06 08 2A 86 48 86 F7 0D 02 05.
  • sequence组合类型的编码 sequence::=0x30 length{asndata}*

如:30 05 02 01 10 05 00表示一个sequence结构,内含两个成员,其中一个为整型16,另一个为空类型(NULL)。

例:考虑如下序列


User ::== SEQUENCE{
ID INTEGER, 
Active BOOLEAN
}

当取值为{32,TRUE}时,编码为 0x30 06 02 01 20 01 01 FF 在ASN.1文档里,使用空格来表示编码的属性. 


0x30 06
02 01 20
01 01 FF

转载于:https://www.cnblogs.com/NathanYang/p/9951282.html

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

ASN.1编码方式详解 的相关文章

  • 十万个为什么!

    目录 1 noqa 在Python评论中意味着什么 1 noqa 在Python评论中意味着什么 import sys sys path append r C dev import some module noqa 答案 将 noqa添加到
  • libreadline.so.6 required but libreadline.so.7 is the current version

    There is an issue talking about this on Github https github com electron userland electron builder issues 993 This error
  • fabric,peer channel create报错:Error: got unexpected status: BAD_REQUEST -- error authorizing update:

    hyperledger fabric的cli在peer channel create 时报错 Error got unexpected status BAD REQUEST error authorizing update error va
  • sudo: vim: command not found

    sudo rm var lib dpkg lock sudo apt get update sudo apt get install vim
  • Maven将依赖包、jar/war包及配置文件输出到指定目录

    写在前面 1 使用 maven dependency plugin 插件将依赖包导出到指定文件夹 2 使用 maven war plugin 插件将war打包到指定路径 3 使用 maven jar plugin 插件移除配置文件将其不打包
  • cmd命令和dos命令_在Windows MS-DOS命令行教程中,带有示例的CMD / C是什么意思?

    cmd命令和dos命令 MS DOS is an operating system and shell used to run commands and provide a command line interface in Windows
  • linux内核中用到的设计模式,Linux内核设计模式–Reference Counts

    这是翻译版 英文原址 设计模式最早来源于建筑学 后被计算机科学引用 简单来说 一个设计模式描述了某类设计问题 并且针对此类问题给出了一个被实践证明有效的解决方案 Linux内核的开发中也遇到过很多设计问题 并且针对这些问题 内核开发者给出了
  • 类型保护

    1 自定义类型保护 function isString value number string value is string const number Math random 10 return number lt 5 首先定义一个函数
  • java.util.zip.ZipException: invalid LOC header (bad signature)

    java util zip ZipException invalid LOC header bad signature maven项目打包时 jar包本身损坏 需要将本地repository中的jar相关文件清除 重新从remote rep
  • 依赖

    添加构建依赖项 概览 implementation与api AndroidStudio升级3 0 gradle随之升级3 0 0 build gradle默implementation而非之前compile gradle 3 0 0 有依赖
  • anaconda 2023.7 安装、配置、开机启动和基本操作 (windows+linux 详细)

    包括notebook的开机启动 启动脚本 配置等 2023年8月13日更新教程 anaconda是conda中的一种 也可以选用其它的conda anaconda会把python pip等直接安装上 不用额外装配了 省心 conda对于需要
  • 文件外发控制如何实现?这个秘密武器请拿走

    你担心敏感文件没有经过授权就外流了吗 你担心文件发给他人后就完全失去控制了吗 你担心图纸外发泄密后 没有任何手段进行追溯吗 你担心重要文档发给别人参考后 被对方肆意转载或复制使用吗 你担心文件过大 其实对方根本就没有收到吗 以上这些问题 都
  • 权限系统与RBAC模型概述[绝对经典]

    0 前言 一年前 我负责的一个项目中需要权限管理 当时凭着自己的逻辑设计出了一套权限管理模型 基本原理与RBAC非常相似 只是过于简陋 当时google了一些权限管理的资料 从中了解到早就有了RBAC这个东西 可惜一直没狠下心来学习 更详细
  • 编程猫创作工具:新版Kitten新体验

    在少儿编程图形化工具方面 Scratch是老牌的创作工具 最为流行 用的人也最多 但是Scratch界面不友好 本地化功能欠缺 网络访问慢等问题也日渐显著 编程猫自主研发的图形化编程创作工具 源码编辑器应运而生 Kitten以更丰富的素材
  • js 判断是不是浮点

    true 非浮点 false 浮点 isNotFloat theFloat gt if theFloat theFloat theFloat trim else return true 判断是否为浮点数 let len theFloat l
  • 测试数据设计方案

    一 测试覆盖率 测试方法及技巧的应用 真正业务场景的满足 测试数据的设计覆盖 1 测试数据设计方法一 构造测试数据时 需要看数据的开源 数据的来源一般来讲有3个 一个是根据被测系统需求的分析 针对正常业务 异常情况 边界情况等来构建完整的数
  • 思科交换机65系列配置

    65系列 enable 进入配置模式 enable set ip http server enable 开启http服务 enable enable enable set system name sike swtest 配置交换机名称 en
  • Mac 上安装并启动 MySQL 服务

    目录 背景 步骤 步骤 1 官网下载 dmg 文件并安装 步骤 2 在系统设置里启动 MySQL 服务 步骤 3 更改 root 密码 步骤 3 1 停止 MySQL 服务 步骤 3 2 在安全模式下启动 MySQL 服务 步骤 3 3 更
  • 三款免费杀毒软件+clamAV

    第一款 antivir PE 完全免费 http www free av com 软件厂商 H BEDV Datentechnik GmbH 软件主页 http www free av com 厂商邮件 virus free av com
  • 【java养成】:案例:学生管理系统、斗地主洗牌

    案例学习 学生管理系统 学生管理系统 参考书籍 系统首页 用于显示系统的所有操作 并根据用户在控制台的输入选择需要使用的功能 查询功能 用户选择该功能后 在控制台打印所有学生的信息 添加功能 用户选择该功能后 要求用户在控制台输入学生学号

随机推荐

  • Python打印九九乘法表(Python)

    算法 打印九九乘法表 方法一 1 运用range 函数 参数值含左不含右 2 Python的print函数默认换行 这里通过把九九乘法表中在一行的转化成字符串类型再打印的方法解决 3 在每个乘式的后面加一个空格来分隔乘式 for i in
  • NYOJ278 排队 (约瑟夫问题)

    原题链接 参考 百科 约瑟夫问题 经典题 附ac代码 include
  • Pytorch 的损失函数Loss function使用详解

    参考 Pytorch 的损失函数Loss function使用详解 云 社区 腾讯云 目录 1 损失函数 1 nn L1Loss 2 nn SmoothL1Loss 3 nn MSELoss 4 nn CrossEntropyLoss 5
  • 虚拟文件系统VFS框架

    复杂度3 5 机密度3 5 最后更新2021 05 01 AIX虽然仅内置支持五种类型的文件系统 jfs jfs2 nfs CDROM ramfs 远少于Linux 但其设计并不局限于某一种特定的文件系统 而是采用虚拟文件系统的概念 以一种
  • 蓝桥杯C/C++省赛:高斯日记

    目录 题目描述 思路分析 AC代码 题目描述 大数学家高斯有个好习惯 无论如何都要记日记 他的日记有个与众不同的地方 他从不注明年月日 而是用一个整数代替 比如 4210 后来人们知道 那个整数就是日期 它表示那一天是高斯出生后的第几天 这
  • 数据库、表数据的三种删除方式

    第一种 drop table 第二种 delete table t第三种 runcate table 三种方式的区别 Drop table删表 常用于正对表 表结构都会被删除 而delete table和truncate table 只删除
  • 进 4 球得 1 分,阿根廷败北背后的科技与狠活

    内容一览 11 月 22 日 世界杯 C 组首场比赛 沙特阿拉伯 2 1 反超阿根廷 今天我们将逐一盘点阿根廷进 4 球得 1 分背后的科技与狠活 关键词 世界杯 VAR 半自动越位技术 沙特爆冷逆袭 2 1 反超阿根廷 2022 年世界杯
  • 图像增强的两个评价指标:峰值信噪比PSNR和结构相似度SSIM

    两种图像增强评价指标 PSNR和SSIM 峰值信噪比PSNR 结构相似度SSIM python实现 SSIM的代码 PSNR的代码 图像增强的评价指标在像素层面上通常包含平均绝对误差 MAE 均方误差法 MSE 峰值信噪比 PSNR 以及结
  • 第6天:分割处理与中断处理

    6 1 分割处理 6 1 1 bootpack c拆分 6 1 2 MakeFile整理 使用了一般规则 gas c Makefile CC1 o gas c nas gas Makefile GAS2NASK gas nas obj na
  • NumPy使用

    NumPy数组的创建 1 创建数组 array 2 制定数组类型 dtype 3 创建特殊数组 1 元素全为0 zeros 2 元素全为1 ones 3 指定元素范围 arange 4 线段性元素 linspace NumPy数组属性 1
  • 分词工具使用系列——sentencepiece使用

    分词工具使用系列 第一章 sentencepiece使用 第二章 jieba工具使用 文章目录 分词工具使用系列 前言 细说分词 一 sentencepiece是什么 二 sentencepiece使用步骤 准备文本 训练模型 使用模型 前
  • JavaScript简单实现拼图小游戏(附源码和资源)

    JavaScript简单实现拼图小游戏 附源码及资源 JavaScript代码68行 是3年前刚学JavaScript的时候写的 思想很简单 分享一下 拼图是4 4的 共三张图 按照命名规则添加其他图片也可以 资源已上传 下载地址 http
  • Hystrix实现断路器、服务降级、线程隔离

    了解Hystrix之前首先需要明白几个概念 雪崩效应 断路器 熔断机制 服务降级 线程隔离 雪崩效应 默认情况下 tomacat只有一个线程池去处理请求 这样在高并发的情况下大量的请求访问同一个服务器接口 线程池中所有的线程都用来处理访问这
  • Linux下某内网主机无法连接,通过添加路由表解决;路由表等网络知识学习

    1 问题描述与解决 这里要记录一个很奇怪的问题 当然是对我这种新手来说的 问题描述如下 当前一台Ubuntu 18 04主机在校园网环境中 同济大学 上海嘉定 上海电信 在apt安装软件的时候经常出现无法连接或者哈希值不匹配的问题 如图 这
  • 又一版A+B问题(注意细节)

    题目描述 输入两个不超过整型定义的非负10进制整数A和B lt 231 1 输出A B的m 1 lt m lt 10 进制数 输入 输入格式 测试输入包含若干测试用例 每个测试用例占一行 给出m和A B的值 当m为0时输入结束 输出 输出格
  • HCIE-Cloud Computing v2.0 lab机考全讲解

    阅读说明 中的内容是 考生的经验 建议 理解 五星表示为 必须背下来 文章目录 一 准备 题型介绍 考试环境 考试地址和密码 必知流程 二 实战 2 1 宏观方面 整体讲解 2 1 1 拓扑 类型接口 2 1 2 简述 2 2 微操 分题型
  • python画正方形的代码_python绘制正方形螺旋线的代码分享

    python绘制正方形螺旋线的代码分享 发布时间 2020 04 28 09 56 56 来源 亿速云 阅读 219 作者 小新 这篇文章主要为大家详细介绍了python绘制正方形螺旋线的代码分享 文中示例代码介绍的非常详细 具有一定的参考
  • Vite和Webpack如何使用CDN包

    为了精简打包输出的dist目录大小 我们可以引入CDN外部包的方式 来缩小打包的体积 加快打包速度 这里介绍Vite和Webpack中如何引入React CDN外部包 一 Vite引入CDN包 1 安装插件 npm i vitejs plu
  • Go实现两个Goroutine通信

    实现两个goroutine通信 要求如下 实现pingpong效果 保证程序能任意时长执行 且收到ctrl c信号之后 全身而退 即保证各个goroutine完整退出 在第三个goroutine中 可随时查找前两个goroutine各自发送
  • ASN.1编码方式详解

    ASN ASN 1 Abstract Syntax Notation dot one 抽象记法1 数字1被ISO加在ASN的后边 是为了保持ASN的开放性 可以让以后功能更加强大的ASN被命名为ASN 2等 但至今也没有出现 描述了一种对数