一般使用另外一套編碼規(guī)則DER择浊,它是BER的一個(gè)子集,對(duì)每個(gè)ASN.1值只有唯一一種編碼方法留潦。
octet(字節(jié))表示一個(gè)8 bit的無(wú)符號(hào)整數(shù)锤悄。
BIT類(lèi)型和值用等寬字體表示。例如翎苫,它通常表示一個(gè)16進(jìn)制的字節(jié)值权埠。
n1粗斜體表示變量
[]粗的方括號(hào)表示該項(xiàng)為可選項(xiàng)
{}粗體大括號(hào)表示一組相關(guān)項(xiàng)
|粗體豎杠表示一組之中的可任選其一
?粗體省略號(hào)表示重復(fù)出現(xiàn)
=粗體等號(hào),用一個(gè)子項(xiàng)表示該項(xiàng)
ASN.1類(lèi)型和值使用一種靈活的煎谍、類(lèi)似編程語(yǔ)言的符號(hào)表示攘蔽,規(guī)則如下:z分層(換行)無(wú)特殊意義;多個(gè)空格和多個(gè)空行相當(dāng)于一個(gè)空格呐粘。z注釋由一對(duì)連字符(--)開(kāi)頭满俗,或者一對(duì)連字符和一個(gè)空行z標(biāo)識(shí)符(值或字段的名字)和類(lèi)型索引(類(lèi)型的名字)由大小寫(xiě)字母、數(shù)字作岖、連字符和空格組成唆垃;標(biāo)識(shí)符由小寫(xiě)字母開(kāi)頭,類(lèi)型索引由大寫(xiě)字母開(kāi)頭痘儡。
z BIT STRING :由0和1任意組成的比特流
z IA5String :由IA5(ASCII)字符任意組成的字符流
z INTEGER :一個(gè)任意的整數(shù)
z NULL :null值
z OBJECT IDENTIFIER :對(duì)象標(biāo)識(shí)符辕万,有一列整數(shù)構(gòu)成,用于確定對(duì)象沉删,如算法或
屬性類(lèi)型
z OCTET STRING :任意的octet(8 bit值)流
z PrintableString :任意可打印字符流
z T61String :T.61(8bit)字符的任意流
z UTCTime : "coordinated universal time"或者格林威治平均時(shí)(GMT)值
抽象語(yǔ)法符號(hào)一是描述抽象類(lèi)型和值的符號(hào)渐尿,縮寫(xiě)為ASN.1。
ASN.1的分配符(::=)給類(lèi)型和值指定名字矾瑰,這些名
字可以用于定義其他類(lèi)型或值
結(jié)構(gòu)類(lèi)型由組件組成砖茸。ASN.1定義了四種,都與PKCS標(biāo)準(zhǔn)有關(guān):
z SEQUENCE:一個(gè)或多個(gè)類(lèi)型的有序集合
z SEQUENCE OF: 0個(gè)或某個(gè)給定類(lèi)型多次出現(xiàn)的有序集合
z SET:一個(gè)或多個(gè)類(lèi)型的無(wú)序集合
z SET OF: 0個(gè)或某給定類(lèi)型多次出現(xiàn)的無(wú)序集合
結(jié)構(gòu)類(lèi)型允許有可選組件殴穴∮嬲茫可選組件可能有默認(rèn)值嵌屎。
使用BER,一個(gè)ASN.1的值有三種編碼方法
簡(jiǎn)單定長(zhǎng)編碼恍涂,結(jié)構(gòu)化定長(zhǎng)編碼宝惰,及結(jié)構(gòu)化不定長(zhǎng)編碼。簡(jiǎn)單的
non-string類(lèi)型使用第一種(簡(jiǎn)單定長(zhǎng)編碼) 再沧;結(jié)構(gòu)化類(lèi)型可使用任一種結(jié)構(gòu)化的編碼方法尼夺;
簡(jiǎn)單的string類(lèi)型根據(jù)值的長(zhǎng)度是否已知可使用任一種方法。 隱式標(biāo)簽定義的類(lèi)型可使用下
層類(lèi)型的方法炒瘸,顯式標(biāo)簽定義的類(lèi)型使用結(jié)構(gòu)化的編碼方法淤堵。
Distinguished Encoding Rules(DER,可辨別編碼規(guī)則)DER是BER的子集顷扩,它定義了使用一個(gè)octet string來(lái)表示任何ASN.1值的編碼方法拐邪。
IA5代表International Alphabet 5,與ASCII相同隘截。
INTEGER類(lèi)型表示任意的整數(shù)扎阶。INTEGER值可以為正數(shù)、負(fù)數(shù)或0婶芭,具有任意大小东臀。在整個(gè)PKCS中INTEGER類(lèi)型用于表示版本號(hào)
內(nèi)容字節(jié)以2的補(bǔ)碼形式給出了整數(shù)值,基于256犀农,最高位
在先惰赋,以使用最少的字節(jié)。值0編碼為一個(gè)00字節(jié)
OBJECT IDENTIFIER類(lèi)型表示一個(gè)對(duì)象識(shí)別符呵哨,由一列整數(shù)組件組成
OBJECT IDENTIFIER值由注冊(cè)機(jī)構(gòu)指定其含義
OCTET STRING類(lèi)型表示任意的字節(jié)流赁濒。一個(gè)OCTET STRING值可以為任意長(zhǎng)度,
包括0孟害。該類(lèi)型為string類(lèi)型
T61String類(lèi)型表示由T.61字符組成的任意流流部。T.61是ASCII字符集的8bit擴(kuò)展。
特殊的"escape"序列定義了隨后字符作為其他語(yǔ)言(如日語(yǔ))的解釋纹坐。
UTCTime類(lèi)型表示"coordinated universal time"或格林威治平均時(shí)間值枝冀。一個(gè)UTCTime
值包括精確到分鐘或秒的本地時(shí)間,及相對(duì)于GMT的偏移(單位為小時(shí)和分鐘) 耘子。
AttributeType類(lèi)型通過(guò)對(duì)象標(biāo)識(shí)符來(lái)識(shí)別一個(gè)屬性果漾。AttributeValue類(lèi)型指定
任一個(gè)屬性值。屬性值的實(shí)際類(lèi)型由屬性類(lèi)型決定谷誓。
Identifier octets绒障,有兩種形式:較小的標(biāo)簽值(標(biāo)簽值在0 和30之間)和較大的標(biāo)簽值(標(biāo)簽值大于等于31)
context-specific 類(lèi)型的標(biāo)簽只能出現(xiàn)在
結(jié)構(gòu)類(lèi)型或CHOICE類(lèi)型的組件中。
0x04 OCTET String? ? ? ? ? ? 任意的octet(8 bit)流
0x05?NULL????????????編碼值固定為05?00.
0x06??OBJECT?IDENTIFIER=OID??:對(duì)象標(biāo)識(shí)符捍歪,有一列整數(shù)構(gòu)成户辱,用于確定對(duì)象鸵钝,如算法或?qū)傩灶?lèi)型
0x10?SEQUENCE?and?SEQUENCE?of???有序集合,of可以為0個(gè)
0x11??SET?and?SET?OF???????????無(wú)序集合庐镐,of可以為0個(gè)
0x13??printableString
0x14?T61String???T.61(8?bit)字符的任意流
0x16??IA5String????由IA5(ASCII)字符任意組成的字符流
0x17??UTC?time???:"coordinated?universal?time"或者格林威治平均時(shí)(GMT)值恩商。
ASN.1提供了一些基本的預(yù)定義的數(shù)據(jù)類(lèi)型:
UNIVERSAL????0????保留給編碼規(guī)則使用
UNIVERSAL????1????布爾類(lèi)型
UNIVERSAL????2?????整數(shù)
UNIVERSAL????3????二進(jìn)制字符串類(lèi)型????位串
UNIVERSAL????4????八進(jìn)制字符串類(lèi)型????八位位組串
UNIVERSAL????5????空類(lèi)型
UNIVERSAL????6????對(duì)象標(biāo)識(shí)符類(lèi)型
UNIVERSAL????7????對(duì)象描述符類(lèi)型
UNIVERSAL????8????外部類(lèi)型和類(lèi)型實(shí)例
UNIVERSAL????9????實(shí)數(shù)類(lèi)型
UNIVERSAL????10????枚舉類(lèi)型
UNIVERSAL????11????嵌入的pdv類(lèi)型
UNIVERSAL????12????UTF8字符串類(lèi)型
UNIVERSAL????13????相關(guān)對(duì)象標(biāo)識(shí)符類(lèi)型
UNIVERSAL????14-15????保留
UNIVERSAL????16????序列和類(lèi)型序列
UNIVERSAL????17???集合和類(lèi)型的集合
UNIVERSAL????18-22,25-30????字符串類(lèi)型
UNIVERSAL????23-24????時(shí)間類(lèi)型
不必為每一個(gè)點(diǎn)分?jǐn)?shù)字進(jìn)行asn1編碼,具體說(shuō)來(lái)就是將一個(gè)點(diǎn)分?jǐn)?shù)字拆分為7bit一組的序列必逆,然后除了最后一個(gè)的最高位填入0之外其余的最高位都填1
由于OID的前兩極的標(biāo)識(shí)數(shù)字都不是很大怠堪,因此更好的辦法就是將OID的前兩級(jí)編碼到一個(gè)7bit的數(shù)中(由于標(biāo)識(shí)more bit需要最高位,所以只剩下7位可以存數(shù)據(jù))名眉,第一級(jí)OID只有3個(gè)粟矿,分別是itu-t(0),iso(1)损拢,joint-iso-itu-t(2)陌粹,并且第二級(jí)OID標(biāo)識(shí)最多也就23,掛于joint-iso-itu-t之下福压,現(xiàn)在需要一個(gè)算法掏秩,將第一級(jí)和第二級(jí)的OID標(biāo)識(shí)編碼到一個(gè)7bit的數(shù)里面,這就需要用一種平坦的方式來(lái)索引前兩級(jí)的數(shù)據(jù)隧膏,構(gòu)造一組虛擬的標(biāo)識(shí)哗讥,為了對(duì)待三個(gè)一級(jí)OID標(biāo)識(shí)更公平嚷那,最好是將127個(gè)“位置”平均分到三個(gè)一級(jí)標(biāo)識(shí)胞枕,于是就將127除以3,結(jié)果是40魏宽,于是頭40個(gè)虛擬標(biāo)識(shí)分給itu-t腐泻,中間40個(gè)分給iso,后面的47個(gè)分給joint-iso-itu-t队询,這樣派桩,前兩級(jí)是a.b的OID的a和b就被編碼成了40*a+b,如此也就節(jié)省了一個(gè)編碼byte蚌斩。本質(zhì)上這種編碼的思想是在分級(jí)的標(biāo)識(shí)上構(gòu)造一組平坦的虛擬標(biāo)識(shí)铆惑。
關(guān)于整形編碼:
編碼過(guò)程規(guī)定對(duì)于正整數(shù),第一個(gè)字節(jié)的最高位必須為0
因此送膳,假設(shè)第一個(gè)字節(jié)大于127(如49468(0xC13C)?0xC1>0x7F)员魏,看上去其編碼應(yīng)該是0x02?02?C1?3C,?但他的最高位為1叠聋,所以應(yīng)該看成負(fù)數(shù)撕阎,最簡(jiǎn)單有效的辦法是用前段零字節(jié)填充,即49468編碼為0x02?03?00?C1?3C碌补。
http://blog.csdn.net/xiao628945/article/details/8006092
參考鏈接:http://blog.csdn.net/taolinke/article/details/6248968
http://blog.csdn.net/baidu_36649389/article/details/53538223
http://www.cnblogs.com/dspeeding/p/3418035.html
http://blog.csdn.net/gdwzh/article/details/19232#reply
openssl asn.1的相關(guān)介紹:
http://blog.csdn.net/jasenwan88/article/details/7718851
各種算法的OID虏束,參考http://blog.csdn.net/wak0408/article/details/38516339
https://msdn.microsoft.com/en-us/library/aa923698.aspx
hash算法的算法ID
https://msdn.microsoft.com/en-us/library/ff635603.aspx
在線(xiàn)P7數(shù)據(jù)解析:
https://lapo.it/asn1js/
http://qistoph.blogspot.jp/2012/01/manual-verify-pkcs7-signed-data-with.html
定長(zhǎng)編碼不定長(zhǎng)編碼問(wèn)題
http://blog.csdn.net/sever2012/article/details/7698297
結(jié)構(gòu)解析P7簽名和P7數(shù)字信封
http://hbaojun.github.io/2014/02/18/PKCS7%E7%BB%93%E6%9E%84%E5%88%86%E6%9E%90%E4%B9%8B%E7%AD%BE%E5%90%8D/
TLV格式編碼解碼
b6決定當(dāng)前的TLV數(shù)據(jù)是一個(gè)單一的數(shù)據(jù)和復(fù)合結(jié)構(gòu)的數(shù)據(jù)棉饶。復(fù)合的TLV是指value域里也包含一個(gè)或多個(gè)TLV,類(lèi)似嵌套的編碼格式. b5~b1如果全為1,則說(shuō)明這個(gè)tag下面還有一個(gè)子字節(jié)镇匀,占兩個(gè)字節(jié)照藻,否則tag占一個(gè)字節(jié)。
來(lái)源:http://blog.csdn.net/kxd_ysheng/article/details/21237957
? ? ? ? ? ?http://blog.csdn.net/chexlong/article/details/6974201