用Objective-C的Security.framework庫解析ASN.1數(shù)據(jù)

ASN.1 全稱 Abstract Syntax Notation One,引用維基百科的介紹如下:

ASN.1本身只定義了表示信息的抽象句法,但是沒有限定其編碼的方法。各種ASN.1編碼規(guī)則提供了由ASN.1描述其抽象句法的數(shù)據(jù)的值的傳送語法(具體表達(dá))。標(biāo)準(zhǔn)的ASN.1編碼規(guī)則有基本編碼規(guī)則(BER,Basic Encoding Rules)、規(guī)范編碼規(guī)則(CER,Canonical Encoding Rules)、唯一編碼規(guī)則(DER,Distinguished Encoding Rules)、壓縮編碼規(guī)則(PER,Packed Encoding Rules)和XML編碼規(guī)則(XER,XML Encoding Rules)。

維基百科

ASN.1有BER、CER、DER、PER、XER,今天我們探索DER格式的數(shù)據(jù)解析,比如網(wǎng)站的HTTPS協(xié)議的證書(.cer擴(kuò)展文件)就是DER編碼的,我們也能看到.cer擴(kuò)展并不一定就是CER編碼。不過也有常規(guī)的用法,.crt.cer.key.csr大部分時候是DER編碼,或者-----BEGIN…開頭-----END...結(jié)尾的文本文件構(gòu)成的PEM編碼,也就是Privacy Enhanced Mail,其實PEM編碼去掉開頭,去掉結(jié)尾,然后base64解碼,也是DER編碼的。.p12大部分時候都是DER編碼的。

為了學(xué)習(xí)DER編碼數(shù)據(jù)的解碼,我找到一個網(wǎng)站和一個StackOverFlow問題:

網(wǎng)站:

通過16進(jìn)制編輯器保存StackOverFlow網(wǎng)站那個問題對應(yīng)的數(shù)據(jù)到二進(jìn)制文件, 也可以base64解碼以下數(shù)據(jù)到文件:

MIGOMQswCQYDVQQGEwJJTDEPMA0GA1UECAwGaXNyYWVsMQwwCgYDVQQHDANUTFYxCzAJBgNVBAoMAlRTMR4wHAYDVQQLDBVDQV9jZXJ0aWZpY2F0ZV9zZXJ2ZXIxGzAZBgNVBAMMEmFhYWFhYWFNYWNCb29rX1BybzEWMBQGCSqGSIb3DQEJARYHekB6LmNvbQ==

使用openssl解析

openssl asn1parse -in sec.key -inform der

如下截圖:

圖片

使用asn1js直接解析16進(jìn)制數(shù)據(jù),如下截圖:

圖片

我們的目標(biāo)是使用Security.framework提供的SecAsn1Decode來解析出如圖的其他工具解析的內(nèi)容,為了簡單起見,僅解析每個SET->SEQUENCE 的值部分,SecAsn1Decode的原型如下:

OSStatus SecAsn1Decode(

需要coder、解碼數(shù)據(jù)及其長度、ASN.1數(shù)據(jù)模板,目標(biāo)存放payload。其中比較麻煩的地方在于構(gòu)造解碼SecAsn1Template,需要事先知道目標(biāo)DER編碼數(shù)據(jù)的結(jié)構(gòu)(或者像我一樣用其他工具先解碼查看)。通過asn1js和openssl的結(jié)果我們可以知道結(jié)構(gòu)是1個SEQUENCE包含7個SET,其中有SET都是包含1個SEQUENCE,SEQUENCE的內(nèi)的數(shù)據(jù)有三種,都是1個oid,1個值。結(jié)構(gòu)如下:

typedef struct

最終構(gòu)造模板:

static const SecAsn1Template kATemplate[] =

最終解碼代碼如下:

SecAsn1CoderRef decoder = NULL;

執(zhí)行結(jié)果:

圖片

與其他工具解析結(jié)果相同(忽略了其他的結(jié)構(gòu)信息),完整代碼見我的github:

https://github.com/coleflowers/asn1decoder

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容