对象标识符
      
       (OBJECT
       
       IDENTIFIER,
       
       
        OID
       
       )
       
      
      
       的编码规则
      
     
    
   
对象标识符类型
    
    
    
    
    
    
    
    对象标识符
    
     (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.
    
   
附:
    MD2:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04
    
    10 || H.
    
    MD5:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04
    
    10 || H.
    
    SHA-1:   (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H.
    
    SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00
    
    04 20 || H.
    
    SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00
    
    04 30 || H.
    
    SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00
    
    04 40 || H.
   
 
