分享

ASN.1 学习——IDENTIFIER类型对象的编码方法

 华灯初放l 2016-05-16
//wings:
例1:
对“2,16,756,5,8,2,01”进行编码:
 原始编码 计算方法 结果
 2,16 =2*40+16=96 0x60
 756 ①=5*128+116;
②高字节的bit7置1。
 0x85,0x74
 5=5  0x05
 8  =8 0x08
 2 =2 0x02
 xx =xx xx

最终结果:0x60,0x85,0x74,0x05,0x08,0x02,xx

2:

对“1,2,840,113549,2,5”进行编码:

 原始编码 计算方法 结果
 1 ,2=1*40+2=42=0x2A
840①=6*128+72;
②高字节的bit7置1。
0x86,0x48
113549①=6*128^2+119*128+13;
②高字节的bit7置1。
0x86,0xf7,0x0d
 2=20x02
5=50x05

最终结果:0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05

/*******************************************************************************/

8 ASN.1 对象标识符类型

      对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范.标识符树通过一个点分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始.

      例如:MD5的OID 是 1.2.840.113549.2.5  表示为"iso(1) member-body (2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)", 所以当解码程序看到这个OID时,就知道是MD5散列.

      OID在公钥算法标准中很流行,它指出证书绑定了哪种散列算法. 同样,也有公钥算法,分组算法,和操作模式的OID. 它们是一种高效且可移植的表示数据包中所选算法的形式.

      对OID的编码规则:

  •  
    • 前两部分如果定义为x.y, 那么它们将合成一个字40*x + y, 其余部分单独作为一个字节进行编码.
    • 每个字首先被分割为最少数量的没有头零数字的7位数字.这些数字以big-endian格式进行组织,并且一个接一个地组合成字节. 除了编码的最后一个字节外,其他所有字节的最高位(位8)都为1.

     举例: 30331 = 1 * 128^2 + 108 * 128 + 123  分割成7位数字(0x80)后为{1,108,123}设置最高位后变成{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. 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多