iOS安全相關(guān) - RSA中公鑰的DER格式組成

RSA中通過公鑰的模n和公開冪e創(chuàng)建PEM格式公鑰

公鑰語法為,而且PEM文件組成是TLV結(jié)構(gòu):

RSAPublicKey ::= SEQUENCE { 
modulus INTEGER, //RSA合數(shù)模n 
publicExponent INTEGER //RSA公開冪e 
}

數(shù)據(jù)實例,各個重要域值

1.modulus: 
AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8 
AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B70142429 
93F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688 
ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0 
E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515 
FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E92 
69F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F11 
9C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7

2.publicExponent: 
00000003

組裝PEM文件

1.按照以上數(shù)據(jù)域順序依次組裝成TLV葵礼。

①modulus組裝

0282010100 
AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8 
AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B70142429 
93F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688 
ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0 
E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515 
FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E92 
69F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F11 
9C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7

說明:

02 - tag 
82 - 81代表長度用1byte表示,82代表長度用2byte表示(此字節(jié)部分tag后不存在) 
0101 - length 2bytes表示 
00 - 在modulus數(shù)據(jù)前添加00,原因未知,請知情道友告知。

②publicExponent組裝:

020103

說明:

02 - tag 
01 - length 
03 - 00000003 在公鑰組裝中兔簇,舍棄0x00;私鑰組裝中,保留0x00

2.組裝成公鑰的DER格式數(shù)據(jù)

①公鑰PEM文件頭摔吏,嵌套多層TLV,本實例文件頭為:

30820120 300d06092a864886f70d0101010500 0382010d 0030820108

說明:

30820120 
30 - tag 
82 - 代表length由2bytes表示 
0120 - length (2bytes)

30 0d 06092a864886f70d0101010500 
30 - tag 
0d - length 
06092a864886f70d0101010500 - value

03 82 010d 
03 - tag 
82 - 代表length由2bytes表示 
010d - value (2bytes)纵装,代表長度

00 3082 0108 
00 - 補0x00征讲,原因未知,請知悉者不吝賜教 
30 - tag 
82 - 代表length由2bytes表示 
0108 - value(2bytes)橡娄,代表長度诗箍。

②依次輸出以上組裝后的數(shù)據(jù)到公鑰的DER格式二進制數(shù)據(jù)

30820120 300d06092a864886f70d0101010500 0382010d 0030820108
0282010100 
AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8 
AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B70142429 
93F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688 
ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0 
E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515 
FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E92 
69F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F11 
9C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7
020103

最終結(jié)果:

30820120300d06092a864886f70d01010105000382010d00308201080282010100AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B7014242993F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E9269F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F119C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7020103

3.對此PEM文件進行Base64編碼,即得到RSA公鑰:

echo 30820120300d06092a864886f70d01010105000382010d00308201080282010100AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B7014242993F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E9269F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F119C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7020103| xxd -r -ps | openssl base64

得到如下PEM公鑰的結(jié)果:

MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAq2AlYhASB9BabEE+JM5C
aZIQOI9dMdKBUeD6kUHZyPiscWwMT0SWFqoicPEAfPO6RvBRMeQCJmsqYo9LcBQk
KZP1vAbjwGCfnlK+jV0M+s9Twu6YUzqYGIKOxcuBIKaIrcYD2+Zd+QWa2AOWRIl4
lpQ5EtgcdoVqt+OAwVMMbeDhVdTJ+5Q5Z8UusUfNvyRkrCtjEFXb4xCUkaBnVnrl
Ff02Qokw+rysfA/rkGwRgVtvAEYuWI3rgcQ2TitiVA6SafSUh8xPhyTdxIHFE0uG
EIyfrNXXGHcGrKLTQlv+TxGcJUJz+lyR7qXrBhVJNtJ+5iJmzcrp400gIpNgVZMl
xwIBAw==

給公鑰信息添加上PEM頭和尾,得到RSA公鑰的PEM格式數(shù)據(jù):

—–BEGIN PUBLIC KEY—–
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAq2AlYhASB9BabEE+JM5C
aZIQOI9dMdKBUeD6kUHZyPiscWwMT0SWFqoicPEAfPO6RvBRMeQCJmsqYo9LcBQk
KZP1vAbjwGCfnlK+jV0M+s9Twu6YUzqYGIKOxcuBIKaIrcYD2+Zd+QWa2AOWRIl4
lpQ5EtgcdoVqt+OAwVMMbeDhVdTJ+5Q5Z8UusUfNvyRkrCtjEFXb4xCUkaBnVnrl
Ff02Qokw+rysfA/rkGwRgVtvAEYuWI3rgcQ2TitiVA6SafSUh8xPhyTdxIHFE0uG
EIyfrNXXGHcGrKLTQlv+TxGcJUJz+lyR7qXrBhVJNtJ+5iJmzcrp400gIpNgVZMl
xwIBAw==
—–END PUBLIC KEY—–

關(guān)于為什么要在N值前補00,見下面一節(jié)

iOSRSA公鑰的DER編碼結(jié)構(gòu)分析

我們使用一個新的公鑰

—–BEGIN PUBLIC KEY—–
MIG3AoGxAJ7EslFDvAMVQLuLWnVVHTxVFswhHLmkHmxgvwKlNRFqIvK3rL1++6vh
5U+/DjBmyyNdL2tIfbyY9konvyM6LxL8Y7IYW/YPwafHnDqNWWokI2Fq+sjqfqcV
v/pYKJAkh4Ya90Ns8C0R+1Jy0jfTRGUv+hPdO4YmXF2hXCjE8wYWGdv2/6EQcDGq
2jbezUpNXm2gnK3i92EhXHw5wSE8Zs7EMubebyMLQQNjSlCzOSvFAgED
—–END PUBLIC KEY—–

去掉頭部和尾部,使用base64解碼,然后以16進制顯示,一共372個字符:

3081B70281B1009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7ACBD7EFBABE1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8D596A2423616AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B86265C5DA15C28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CEC432E6DE6F230B4103634A50B3392BC5020103

將這部分公鑰分解:

3081B7
0281B1
009EC4B25143BC031540BB8B5A75551D3C5516CC211CB9A41E6C60BF02A535116A22F2B7ACBD7EFBABE1E54FBF0E3066CB235D2F6B487DBC98F64A27BF233A2F12FC63B2185BF60FC1A7C79C3A8D596A2423616AFAC8EA7EA715BFFA5828902487861AF7436CF02D11FB5272D237D344652FFA13DD3B86265C5DA15C28C4F3061619DBF6FFA1107031AADA36DECD4A4D5E6DA09CADE2F761215C7C39C1213C66CEC432E6DE6F230B4103634A50B3392BC5
020103

注解:采用的是TLV結(jié)構(gòu)(tag-length-value)在此將整個編為一個sequence結(jié)構(gòu)體挽唉,以tag(30)作為開始標志滤祖,從第四位02開始便是此sequence的內(nèi)容筷狼,相當于結(jié)構(gòu)體的元素,一般來說sequence往往需要嵌套匠童,相當于結(jié)構(gòu)體嵌結(jié)構(gòu)體埂材,但對公鑰的sequence來說,此處僅有一層汤求。 第四位tag(02)代表一下的內(nèi)容為bit流俏险,同樣緊隨其后的81代表有一字節(jié)代表長度,第六位的B1代表長度為177扬绪,即從00開始直到最后一行C5此為177字節(jié)竖独,去掉前面的00,余下176位便是rsa公鑰的模n值(1408 bit)(即在生成RSA對時指定的模長<放!)

最后3個字節(jié)同樣是tag(02)開頭的bit流莹痢,以02開始,03表示長度為3墓赴,最后的03 便是rsa公鑰的公開指數(shù)e值格二。

關(guān)于為什么要在n值前補00,這是ASN.1的規(guī)定竣蹦,若tag(02)表示的bit流的前四bit十六進制值大于8就要在在最前補零顶猜。

參見下例子:30 81 88 02 81 80 32 8d 99 06 9f bd 9a c0 e5 6a,其中0X3小于8,所以就不需要補00痘括!

補記:這是因為modulus 為一個大整數(shù)长窄,最高位為符號位,其為1時纲菌,就是負數(shù)挠日,所以要在最高位填充0x00以保證不為負。

長度的表示方法有以下2種情況:

  1. 數(shù)據(jù)長度<0x80的時候,Length即為數(shù)據(jù)的長度;
  2. 數(shù)據(jù)長度>=0x80的時候巷懈,Length為0x8?,表示后面跟的懂算?表示的Length長度。例如82 01 20庇麦,82表示82后面2個字節(jié)為長度的字節(jié)長度计技,數(shù)據(jù)長度為0x0120。

參考:

http://www.voidcn.com/blog/lingruoshui/article/p-2090498.html
http://blog.csdn.net/xuanshao_/article/details/51679824

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末山橄,一起剝皮案震驚了整個濱河市垮媒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖睡雇,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萌衬,死亡現(xiàn)場離奇詭異,居然都是意外死亡它抱,警方通過查閱死者的電腦和手機奄薇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抗愁,“玉大人,你說我怎么就攤上這事呵晚≈╇纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵饵隙,是天一觀的道長撮珠。 經(jīng)常有香客問我,道長金矛,這世上最難降的妖魔是什么芯急? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驶俊,結(jié)果婚禮上娶耍,老公的妹妹穿的比我還像新娘。我一直安慰自己饼酿,他們只是感情好榕酒,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著故俐,像睡著了一般想鹰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上药版,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天辑舷,我揣著相機與錄音,去河邊找鬼槽片。 笑死何缓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的还栓。 我是一名探鬼主播歌殃,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝙云!你這毒婦竟也來了氓皱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波材,沒想到半個月后股淡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡廷区,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年唯灵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隙轻。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡埠帕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玖绿,到底是詐尸還是另有隱情敛瓷,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布斑匪,位于F島的核電站呐籽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚀瘸。R本人自食惡果不足惜狡蝶,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贮勃。 院中可真熱鬧贪惹,春花似錦、人聲如沸寂嘉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫释。三九已至丝格,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棵譬,已是汗流浹背显蝌。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留订咸,地道東北人曼尊。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像脏嚷,于是被迫代替她去往敵國和親骆撇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,970評論 6 13
  • 嘟噥嘟噥:最近接到一個任務(wù):在客戶端動態(tài)生成RSA密鑰對父叙,然后向服務(wù)器發(fā)送這個密鑰對中的公鑰字符串神郊,由服務(wù)器進行公...
    TimmyR閱讀 8,033評論 19 21
  • 1 基礎(chǔ) 1.1 對稱算法 描述:對稱加密是指加密過程和解密過程使用相同的密碼肴裙。主要分:分組加密、序列加密涌乳。 原理...
    御淺永夜閱讀 2,401評論 1 4
  • 1.數(shù)據(jù)安全 01數(shù)據(jù)安全的原則1)在網(wǎng)絡(luò)上"不允許"傳輸用戶隱私數(shù)據(jù)的"明文"2.)在本地"不允許"保存用戶隱私...
    小楓123閱讀 467評論 0 1
  • 看了秋大的一些源碼蜻懦,記錄一下。 同時看了windowManager的高端知識,以后過來回顧夕晓。
    森碼閱讀 308評論 0 0