对象标识符
(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.