DER编码规则

文章目录

  • 一、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 31
    30 0d
        0609608648016503040201
        0500
    0420           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编码值

你可能感兴趣的:(ASN1,java,开发语言)