一、实验要求
- 参考附件中图书p120 中7.1的实验指导,完成DER编码
- Name实例中,countryName改为“CN”,organization Name-"你的学号" commoaName="你的姓名拼音"
- 用echo -n -e "编码" > 你的学号.der中,用OpenSSL asn1parse 分析编码的正确性
- 提交编码过程文档(推荐markdown格式)
二、DER编码
0.查看CN、姓名、学号的16进制ASCII码
echo -n "CN" | od -tc -tx1
echo -n "libolin" | od -tc -tx1
echo -n "20211201" | od -tc -tx1
1.AttributeType编码
AttributeType为OBJECT IDENTIFIER基本类型,编码规则采用基本类型定长模式。
对于标识串,采用低标识编码方式,只需1个字节。OBJECT IDENTIFIER的tag为0x06:class选择universal,则位8和位7为0,OBJECT IDENTIFIER为基本类型,则位6为0。因此,标识串=0x06。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由3个字节组成。2.5.4.6编码为55 04 06,2.5.4.10编码为55 04 0A,2.5.4.3编码为55 04 03。
具体编码过程如表所示。
AttributeType | OID定义 | 标识串 | 长度串 | 内容串 |
---|---|---|---|---|
countryName | 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,OBJECT IDENTIFIER为基本类型,则位6为0。因此,标识串=0x13。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由其ASCII码组成。
具体编码过程如表所示。
AttributeValue | 标识串 | 长度串 | 内容串 |
---|---|---|---|
"US" | 13 | 02 | 55 53 |
"Example rganization" | 13 | 14 | 45 78 61 6D 70 6C 65 20 4F 7267 61 6E 69 7A 61 74 69 6F 6E |
"Test User 1" | 13 | 0B | 54 65 73 74 20 55 73 65 72 20 31 |
"CN" | 13 | 02 | 43 4E |
"20211201" | 13 | 08 | 32 30 32 31 31 32 30 31 |
"libolin" | 13 | 07 | 6c 69 62 6f 6c 69 6e |
3.AttributeValueAssertion编码
AttributeValueAssertion为SEQUENCE结构类型,编码规则采用结构类型定长模式。
对于标识串,采用低标识编码方式,只需1个字节。SEQUENCE的tag为OxlO:class选择universal,则位8和位7为0,SEQUENCE为结构类型,则位6为1。因此,标识串0x30.
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由AttributeType和AttributeValue的DER编码值组成。
具体编码过程如表所示。
AttributeValueAssertion | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="US" | 30 | 09 | 06 03 55 04 06 13 02 55 53 |
organizationName="Example rganization" | 30 | 1B | 06 03 55 04 0A 13 14 45 78 61 6D 70 6C 65 20 4F 72 67 61 6E 69 7A 61 74 69 6F 6E |
commonName="Test User 1" | 30 | 12 | 06 03 55 04 03 13 0B 54 65 73 74 20 55 73 65 72 20 31 |
countryName="CN" | 30 | 09 | 06 03 55 04 06 13 02 43 4E |
organizationName="20211201" | 30 | 1B | 06 03 55 04 0A 13 08 32 30 32 31 31 32 30 31 |
commonName="libolin" | 30 | 12 | 06 03 55 04 03 13 06 6c 69 62 6f 6c 69 6e |
4.RelativeDistinguishedName编码
RelativeDistinguishedName为SET OF结构类型,编码规则采用结构类型定长模式。
对于标识串,采用低标识编码方式,只需1个字节。SET OF的tag为0xl1;class选择universal,则位8和位7为0,SET OF为结构类型,则位6为1。因此,标识串=0x31。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由AttributeValueAssertion的DER编码值组成。
具体编码过程如表所示。
RelativeDistinguishedName | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="US" | 31 | 0B | 30 09 06 03 55 04 06 13 02 55 53 |
organizationName="Example rganization" | 31 | 1D | 30 1B 06 03 55 04 0A 13 14 45 78 61 6D 70 6C 65 20 4F 72 67 61 6E 69 7A 61 74 69 6F 6E |
commonName="Test User 1" | 31 | 14 | 30 12 06 03 55 04 03 13 0B 54 65 73 74 20 55 73 65 72 20 31 |
countryName="CN" | 31 | 0B | 30 09 06 03 55 04 06 13 02 43 4E |
organizationName="20211201" | 31 | 11 | 30 0F 06 03 55 04 0A 13 08 32 30 32 31 31 32 30 31 |
commonName="libolin" | 31 | 15 | 30 0D 06 03 55 04 03 13 06 6c 69 62 6f 6c 69 6e |
5.RDNSequence编码
RDNSequence为SEQUENCE OF结构类型,编码规则采用结构类型定长模式。
对于标识串,采用低标识编码方式,只需1个字节。SEQUENCE OF的tag为0x10;class选择universal,则位8和位7为0,SEQUENCE OF为结构类型,则位6为1。因此,标识串=0x30。
对于长度串,采用短型编码方式,只需1个字节。
对于内容串,由3个RelativeDistinguishedName的DER编码值组成。
具体编码过程如表7-5所示。
RDNSequence | 标识串 | 长度串 | 内容串 |
---|---|---|---|
countryName="US" | 30 | 42 | 31 0B 30 09 06 03 55 04 06 13 02 55 5331 1D 30 1B 06 03 55 04 0A 13 14 45 78 61 6D 70 6C 65 20 4F 72 67 61 6E 69 7A 61 74 69 6F 6E31 14 30 12 06 03 55 04 03 13 0B 54 65 73 74 20 55 73 65 72 20 31 |
countryName="CN" | 30 | 37 | 31 0B 30 09 06 03 55 04 06 13 02 43 4E31 11 30 0F 06 03 55 04 0A 13 08 32 30 32 30 31 32 31 3231 15 30 13 06 03 55 04 03 13 0C 59 61 6e 67 20 43 68 65 6e 67 79 75 |
6.Name编码
Name为CHOICE类型,其DER编码值与RDNSequence相同。
用户Test User1最终DER编码值如表7-6所示。
DER编码值 | ASN.1描述 |
---|---|
30 42 31 0B 30 09 06 03 55 04 06 13 02 55 53 31 1D 30 1B 06 03 55 04 0A 13 14 45 78 61 6D 70 6C 65 20 4F 72 67 67 61 6E 69 7A 61 74 69 6F 6E 31 14 30 12 06 03 55 04 03 13 0B 54 65 73 74 20 55 73 65 72 20 31 |
attributeType=country NameattributeValue="US" attributeType=organizationName attributeValue="Example Organization" attributeType=commonName attributeValue="Test User 1" |
30 37 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 32 30 31 31 0F 30 0D 06 03 55 04 03 13 06 6c 69 62 6f 6c 69 6e |
attributeType=countryNameattributeValue="CN" attributeValue="CN" attributeType=organizationName attributeValue="20211201" attributeType=commonName attributeValue="libolin" |
三、DER编码验证
0.验证
openssl asn1parse -inform der -in ./20211201.der
1.countryName="CN"
echo -n -e "\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E" > 20211201.der
echo -n -e "\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x32\x30\x32\x31\x31\x32\x30\x31" >> 20211201.der
3.commonName="libolin"
echo -n -e "\x31\x0F\x30\x0D\x06\x03\x55\x04\x03\x13\x06\x6c\x69\x62\x6f\x6c\x69
\x6e
" >> 20211201.der