DER编码规则

news/2024/11/8 2:53:29/

文章目录

  • 一、DER(Distinguished Encoding Rules)
  • 二、 DER与BER的区别
  • 三、示例说明

一、DER(Distinguished Encoding Rules)

DER 适用于需要唯一编码的情况,例如在密码学中,并确保需要数字签名的数据结构产生唯一的序列化表示。DER 可以被认为是 BER 的规范形式。DER编码主要是为满足 X.509 规范的安全数据传输的要求而创建的。

二、 DER与BER的区别

DER 在 BER 规则基础上增加了如下限制:

  1. 如果长度在 0 - 127 之间,必须使用短型长度表示法,definite-Short-form;
  2. 如果长度大于等于 128,必须使用长型长度表示法,并且长度必须使用尽可能少的字节表示;
  3. 对于简单 string 类型和在其基础上使用隐式标签生成的类型,必须使用简单定长编码方法;
  4. 对于结构化类型和在其基础上使用隐式标签生成的类型及在任何类型基础上使用显式标签生成的类型,必须使用结构化定长编码方法。

三、示例说明

下面是私钥签名der编码的数据

     DigestInfo ::= SEQUENCE {digestAlgorithm AlgorithmIdentifier,digest OCTET STRING}AlgorithmIdentifier  ::=  SEQUENCE  {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algorithm OPTIONAL  }
30 3130 0d060960864801650304020105000420           d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
  1. 第一个字节30代表Identifier octets Type,转换成2进制是 00110000,我们计算下type,前2位是tag class,00110000 >> 6 = 00 代表universal,对照表SEQUENCE是原始数据类型,所以是OK的。第三个位是1代表是复合数据类型,也就是由多个元素构造的数据类型Constructed,那后边的10000`自然是tagNumber了,转换成十进制是16刚好与上表对应。

  2. 第二个字节31 代表 Identifier octets length,转换成2进制是00110001,通过编码后的数据,我们可以看出长度是小于127的(可以用0x31 & 0x7F == 0x31,如果是true,说明是短格式,否则是长格式,如果是长格式那0x31 & 0x7F = 长度占用了几个字节,那紧接着往后的这几个字节组成的就代表长度值本身),而DER编码长度在 0 - 127 之间,使用的是定长的短长度编码,第一位是0,后边7个位代表长度,那么长度=00110001 也就是31。

  3. 第三个字节还是30,因为是SEQUENCE里面套了个SEQUENCE,所以30代表的是AlgorithmIdentifier结构体的type。

  4. 第四个字节同理0d代表的是长度,AlgorithmIdentifier这个的长度,0x0d==十进制的13所以13就是长度,短长度。

  5. 第五个往后13个字节0609 6086480165030402010500就代表AlgorithmIdentifier这个的数据内容

    5.1 这13个字节其中有11个字节0609608648016503040201是算法标识符Algorithm

    a. 0609,是type和长度,后边的是数据内容,06 转换为二进制0000 0110,前2位00是tag class 第三位0代表不是构造的复合数据类型,0 0110就是tagnumber,也就是6。
    b 608648016503040201 就是sha256算法标识符2.16.840.1.101.3.4.2.1DER编码后的值.

    5.2 05和00是值NULL的编码,我们在代码中给的值就是NULL,05这个字节指的是NULL的type,00指的是长度为0么。

  6. 第十四个字节04指的是Digest 它的类型是OCTET STRING,那tag class为 universal 值是0,基本数据类型primitive由一个元素组成值是0,tag number是4,组合起来就是00 0 00100,转16进制是0x04。

  7. 第十五个字节20代表了长度,指的是Digest这个字段的长度,用二进制表示0010 0000,短格式,长度就是32个字节。

  8. 剩下的d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35就是数据编码的内容了,在本示例中就是哈希值h的DER编码值


http://www.ppmy.cn/news/1241474.html

相关文章

Java基层卫生健康云综合管理(云his)系统源码

云HIS(Cloud-Based Healthcare Information System)是基于云计算的医院健康卫生信息系统。它运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、…

nrm安装及使用

一、介绍 nrm 是一个 Node.js 的 registry 管理工具,它允许你快速地在不同的 npm registry 之间进行切换。通过使用 nrm,你可以方便地将 npm 的 registry 切换为淘宝镜像、npm 官方镜像或者其他定制的镜像,以加快包的下载速度。nrm仓库请点击…

c++ 重写 多态

1 重写(继承后(拼接基类后)) 1.1 非虚函数 同名成员函数 (各自有一个xFunction() 内存 ) #include <iostream> #include <String> class BaseClass { public:void xFunction() {std::cout << "BaseClass::xFunction()\n"; } };class Subclass1 …

机器学习探索计划——数据集划分

文章目录 导包手写数据划分函数使用sklearn内置的划分数据函数stratifyy理解举例 导包 import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_blobs手写数据划分函数 x, y make_blobs(n_samples 300,n_features 2,centers 3,clus…

JavaSE 知识点总结

路在脚下&#xff0c;行则将至 目录 1. 初始Java 1.1 Java之父——高斯林 1.2 一次编译&#xff0c;到处运行 1.3 注释 2. 数据结构与变量 2.1 数据类型 2.2 变量 2.3 常量 3. 运算符 3.1 逻辑与 && 3.2 逻辑 || 3.3 逻辑非 ! 3.4 特殊的位运算符(C语言没有)…

github使用token认证

向github提交代码时报错&#xff1a;Support for password authentication was removed on August 13, 2021. Please use a personal access token instead。大概意思就是&#xff0c;原先的密码凭证从2021年8月13日开始就不能用了&#xff0c;后续必须使用个人访问令牌&#x…

⑥【bitmap 】Redis数据类型: bitmap [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …

4-Docker命令之docker create

1.docker create介绍 docker create命令是用于创建一个新的容器,等价于docker run -d命令,但是与docker run -d不同的是,docker create创建的容器并未实际启动,需要指定docker start命令启动。 2.docker create用法 docker create [参数] [root@centos79 ~]# docker cr…