DER编码
DER编码
目录
* 查看ASCII码
- DER编码过程
一、查看ASCII码
echo -n "CN" | od -tc -tx1
echo -n "zhaobin" | od -tc -tx1
echo -n "20201229" | od -tc -tx1
C N
43 4e
2 0 2 1 1 3 0 6
32 30 32 31 31 33 30 36
d i n g w e n b o
64 69 6e 67 77 65 6e 62 6f
二、DER编码过程
1.ASN.1描述与实例
Name 类型定义为 CHOICE类型,目前只有1个选项RDNSequence。RDNSequence 定义为SEQUENCE OF 类型,由0个或多个 RelativeDistinguishedName 组成。RelativeDistinguishedName定义为SET OF类型,由0个或多个AttributeValueAssertion组成。AttributeValueAssertion定义为SEQUENCE类型,由2个成分组成:1个为AttributeType类型和1个AttributeValue类型。AttributeType定义为OBJECTIDENTIFIER类型。AttributeValue 定义为 ANY 类型,具体内容由AttributeType 决定。
事实上,Name类型可理解为分层或树形结构,即X.500目录树结构。
1.Attribute Type 编码
AttributeType为OBJECTIDENTIFIER基本类型,编码规则采用基本类型定长模式。对于标识串,采用低标识编码方式,只需1个字节。OBJECTIDENTIFIER的tag为0x06:class选择universal,则位8和位7为0,OBJECTIDENTIFIER为基本类型,则位6为0。因此,标识串=0x06。
对于长度串,采用短型编码方式,只需1个字节。对于内容串,由3个字节组成。2.5.4.6编码为55 0406,2.5.4.10编码为 55 04 0A,2.5.4.3编码为 55 04 03。
Attribute Type | OID定义 | 标识串 | 长度串 | 内容串 |
---|---|---|---|---|
countrysideName | 2.5.4.6 | 06 | 03 | 55 04 06 |
organizationNAme | 2.5.4.10 | 06 | 03 | 55 04 0A |
commonName | 2.5.4.3 | 06 | 03 | 55 04 03 |
2.AttributeValue 编码
AttributeValue 为PrintableString基本类型,编码规则采用基本类型定长模式。对于标识串,采用低标识编码方式,只需1个字节。PrintableString的tag为0x13;class选择universal,则位8和位7为0,OBJECTIDENTIFIER为基本类型,则位6为0。因此标识串=0x13。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由其 ASCII码组成。
AttributeValue | 标识串 | 长度串 | 内容串 |
---|---|---|---|
"CN" | 13 | 02 | 43 4E |
"20211306" | 13 | 08 | 32 30 32 31 31 33 30 36 |
"dingwenbo" | 13 | 09 | 64 69 6e 67 77 65 6e 62 6f |
3.AttributeValueAssertion 编码
AttributeValueAssertion为SEQUENCE 结构类型,编码规则采用结构类型定长模式对于标识串,采用低标识编码方式,只需1个字节。SEQUENCE的tag为0x10;class选择 universal,则位8和位7为0,SEQUENCE为结构类型,则位6为1。因此,标识串=0x30。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由AttributeType和AttributeValue的DER编码值组成。
AttributeValueAssertion | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="CN" | 30 | 09 | 06 03 55 04 06 13 02 43 4E |
organizationName="20211306" | 30 | 0F | 06 03 55 04 0A 13 08 32 30 32 31 31 33 30 36 |
commonName="dingwenbo" | 30 | 10 | 06 03 55 04 03 13 09 64 69 6e 67 77 65 6e 62 6f |
4.RelativeDistinguishedName 编码
RelativeDistinguishedName为SETOF结构类型,编码规则采用结构类型定长模式对于标识串,采用低标识编码方式,只需1个字节。SETOF的tag为0x11;class选择universal,则位8和位7为0,SETOF为结构类型,则位6为1。因此,标识串=0x31。对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由AttributeValueAssertion的DER编码值组成
RelativeDistinguishedName | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="CN" | 31 | 0B | 30 09 06 03 55 04 06 13 02 43 4E |
organizationName= "20211306" | 31 | 11 | 30 0F 06 03 55 04 0A 13 08 32 30 32 31 31 33 30 36 |
commonName="dingwenbo" | 31 | 12 | 30 10 06 03 55 04 03 13 09 64 69 6e 67 77 65 6e 62 6f |
5.RDNSEquence 编码
RDNSequence为SEQUENCEOF结构类型,编码规则采用结构类型定长模式。对于标识串,采用低标识编码方式,只需1个字节。SEQUENCEOF的tag为0x10:class选择universal,则位8和位7为0,SEQUENCEOF为结构类型,则位6为1。因此标识串=0x30。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由3个RelativeDistinguishedName的DER编码值组成。
RDNSequence | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="CN" organizationName= "20211306" commonName="dingwenbo" | 30 | 34 | 30 34 31 0B 30 09 06 03 55 04 06 13 02 43 4E 31 11 30 0F 06 03 55 04 0A 13 08 32 30 32 31 31 33 30 36 31 12 30 10 06 03 55 04 03 13 09 64 69 6e 67 77 65 6e 62 |
6.Name 编码
Name为CHOICE类型,其DER编码值与RDNSequence相同
DER编码值 | ASN.1描述 |
---|---|
30 34 31 0B 30 09 06 03 55 04 06 13 02 43 4E 31 11 30 0F 06 03 55 04 0A 13 08 32 30 32 31 31 33 30 36 31 12 30 10 06 03 55 04 03 13 09 64 69 6e 67 77 65 6e 62 6f | attributeType=countryName attributeValue="CN" attributeType=organizationName attributeValue="20211306" attributeType=commonName attributeValue="dingwenbo" |
7.实操过程
- 验证方法:
openssl asn1parse -inform der -in ./20211306.der
- countryName="CN"
echo -n -e "\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E" > 20211306.der
- organization Name="21211306"
echo -n -e "\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x32\x30\x32\x31\x31\x33\x30\x36" >> 20211306.der
- commonName="dingwenbo"
echo -n -e "\x31\x12\x30\x10\x06\x03\x55\x04\x03\x13\x09\x64\x69\x6e\x67\x77\x65\x6e\x62\x6f" >> 20211306.der
- 完整
echo -n -e "\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E" > 20211306.der
echo -n -e "\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x32\x30\x32\x31\x31\x33\x30\x36" >> 20211306.der
echo -n -e "\x31\x12\x30\x10\x06\x03\x55\x04\x03\x13\x09\x64\x69\x6e\x67\x77\x65\x6e\x62\x6f" >> 20211306.der