ASN.1

一般使用另外一套編碼規(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坑律,一起剝皮案震驚了整個(gè)濱河市岩梳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晃择,老刑警劉巖冀值,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宫屠,居然都是意外死亡列疗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)浪蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抵栈,“玉大人,你說(shuō)我怎么就攤上這事坤次」啪ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵缰猴,是天一觀(guān)的道長(zhǎng)产艾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)滑绒,這世上最難降的妖魔是什么闷堡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮疑故,結(jié)果婚禮上杠览,老公的妹妹穿的比我還像新娘。我一直安慰自己纵势,他們只是感情好踱阿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钦铁,像睡著了一般软舌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上育瓜,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天葫隙,我揣著相機(jī)與錄音,去河邊找鬼躏仇。 笑死恋脚,一個(gè)胖子當(dāng)著我的面吹牛腺办,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糟描,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼怀喉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了船响?” 一聲冷哼從身側(cè)響起躬拢,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎见间,沒(méi)想到半個(gè)月后聊闯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡米诉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年菱蔬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片史侣。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拴泌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惊橱,到底是詐尸還是另有隱情蚪腐,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布税朴,位于F島的核電站回季,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掉房。R本人自食惡果不足惜茧跋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一慰丛、第九天 我趴在偏房一處隱蔽的房頂上張望卓囚。 院中可真熱鬧,春花似錦诅病、人聲如沸哪亿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝇棉。三九已至,卻和暖如春芥永,著一層夾襖步出監(jiān)牢的瞬間篡殷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工埋涧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留板辽,地道東北人奇瘦。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劲弦,于是被迫代替她去往敵國(guó)和親耳标。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,990評(píng)論 6 13
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理邑跪,服務(wù)發(fā)現(xiàn)次坡,斷路器,智...
    卡卡羅2017閱讀 134,669評(píng)論 18 139
  • 0.作業(yè)要求 使用ASN.1編寫(xiě)一個(gè)數(shù)據(jù)結(jié)構(gòu)画畅。數(shù)據(jù)結(jié)構(gòu)自己考慮砸琅。 分別使用asn1c、JavaAsn1Compil...
    htkz閱讀 16,085評(píng)論 5 7
  • 我怕我會(huì)忘了這一刻的感覺(jué)轴踱,所以先把一些不能發(fā)在朋友圈里的話(huà)記錄在這里明棍。
    大王老師的日記閱讀 350評(píng)論 0 3
  • 有時(shí)候會(huì)遇到UILabel中的內(nèi)容超出長(zhǎng)度,顯示不完全的問(wèn)題寇僧。有一種解決方法是通過(guò)動(dòng)畫(huà)字幕來(lái)實(shí)現(xiàn)摊腋,比如: 1.字幕...
    韓七夏閱讀 6,526評(píng)論 1 5