密码学专题 文件编码格式
生活随笔
收集整理的這篇文章主要介紹了
密码学专题 文件编码格式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
- OpenSSL中雖然使用PEM作為基本的文件編碼格式,但是,由于不同的對(duì)象其封裝的標(biāo)準(zhǔn)格式不太一樣,所以經(jīng)常會(huì)導(dǎo)致讀者產(chǎn)生迷惑。此外,OpenSSL也支持DER編碼和過時(shí)的Netscape編碼格式(NET)
- OpenSSL的編碼是基于ASN.1標(biāo)準(zhǔn)的,ASN.1全稱為AbstractSyntaxNotationOne,是一種描述數(shù)字對(duì)象的方法和標(biāo)準(zhǔn)。ASN.1是一種結(jié)構(gòu)化的數(shù)字對(duì)象描述語言,它包括了兩部分,分別為數(shù)據(jù)描述語言(ISO8824)和數(shù)據(jù)編碼規(guī)則(ISO8825)。
- ASN.1的數(shù)據(jù)描述語言標(biāo)準(zhǔn)允許用戶自定義基本數(shù)據(jù)類型,并可以通過簡(jiǎn)單的數(shù)據(jù)類型組成更復(fù)雜的數(shù)據(jù)類型。比如一個(gè)復(fù)雜的數(shù)據(jù)對(duì)象,如X.509證書,就是在其他一些數(shù)據(jù)類型上定義的,而其他數(shù)據(jù)類型又是在更基本的數(shù)據(jù)類型上建立的,直到回溯到定義的最基本的數(shù)據(jù)類型。
- ASN.1提供了多種數(shù)據(jù)編碼方法,包括了BER,DER,PER和XER等。這些編碼方法規(guī)定了將數(shù)字對(duì)象轉(zhuǎn)換成應(yīng)用程序能夠處理、保存和網(wǎng)絡(luò)傳輸?shù)亩M(jìn)制編碼形式的一組規(guī)則。目前經(jīng)常被采用的是BER(BasicEncodeRules)編碼,但是BER編碼具有編碼不唯一的性質(zhì),也就是說,一個(gè)相同的對(duì)象通過BER編碼可能會(huì)產(chǎn)生幾種不同的編碼數(shù)據(jù)。所以,在OpenSSL和其他密碼學(xué)相關(guān)軟件中經(jīng)常使用BER的一個(gè)子集DER(DistinguishedEncodingRules)。對(duì)于每一個(gè)ASN.1對(duì)象,使用DER編碼得出的二進(jìn)制編碼數(shù)據(jù)是唯一的。
- PEM編碼全稱是PrivacyEnhancedMail,是一種保密郵件的編碼標(biāo)準(zhǔn)。通常來說,對(duì)信息的編碼過程基本如下。
- 1 信息轉(zhuǎn)換為ASCI碼或其他編碼方式,比如采用DER編碼。
- 2 使用對(duì)稱加密算法加密經(jīng)過編碼的信息。
- 3 使用BASE64對(duì)加密后的信息進(jìn)行編碼。
- 4 使用一些頭定義對(duì)信息進(jìn)行封裝,主要包含了進(jìn)行正確解碼需要的信息,頭定義的格式形式如下:
- Proc_Type,4:ENCRYPTED??
- DEK-Info:cipher-name,ivec
- 其中,第一個(gè)頭信息標(biāo)注了該文件是否進(jìn)行了加密,該頭信息可能的值包括ENCRYPTED(信息已經(jīng)加密和簽名),MIC-ONLY(信息經(jīng)過數(shù)字簽名但沒有加密),MIC-CLEAR(信息經(jīng)過數(shù)字簽名但是沒有加密,也沒有進(jìn)行編碼,可使用非PEM格式閱讀),以及CLEAR;第二個(gè)頭信息標(biāo)注了加密的算法及對(duì)稱加密塊算法使用的初始向量。
- 在這些信息的前面加上如下形式頭標(biāo)注信息:—BEGIN PRIVACY-ENHANCED MESSAGE—
- 在這些信息的后面加上如下形式尾標(biāo)注信息:—END PRIVACY-ENHANCED MESSAGE—
- OpenSSL的PEM編碼基本上是基于DER編碼之上的,也就是說,它在上述第一步采用的是DER編碼,所以,從本質(zhì)上來說,OpenSSL的PEM編碼就是在DER編碼基礎(chǔ)上進(jìn)行BASE64編碼,然后添加一些頭尾信息組成的。讀者可以做一個(gè)實(shí)驗(yàn),將OpenSSL簽發(fā)的PEM證書文件轉(zhuǎn)換成DER編碼(二進(jìn)制),導(dǎo)入到WindowsIE中,然后再?gòu)腤indowsIE以BASE64編碼的DER格式導(dǎo)出到另一個(gè)文件中,比較原始的PEM格式文件跟新導(dǎo)出的DER文件,讀者會(huì)發(fā)現(xiàn)其實(shí)是一樣的。事實(shí)上,OpenSSL也是將以這種方式導(dǎo)出的文件當(dāng)成是PEM格式的文件進(jìn)行解碼的。需要說明的是,OpenSSL的指令有對(duì)特定類型的文件(比如X.509證書文件)進(jìn)行PEM和DER格式轉(zhuǎn)換的方法。由于OpenSSL里面的DER格式是指沒有經(jīng)過BASE64編碼的DER格式,所以事實(shí)上就是在二進(jìn)制的DER和BASE64編碼的DER(PEM)格式之間進(jìn)行轉(zhuǎn)換。
- OpenSSL還支持一種老式的Netscape編碼格式(NET),由于這種格式現(xiàn)在基本上廢棄不用了,這里不再作更多的介紹。
證書編碼
X.509證書
- 數(shù)據(jù)編碼格式提供了封裝數(shù)據(jù)的基本方法,但是,對(duì)于具體的數(shù)據(jù)對(duì)象,比如證書,根據(jù)其包含的內(nèi)容的不同,還有更具體的表達(dá)方式。
- 目前總的來說有三種常用的證書編碼格式:X.509證書、PKCS#12證書和PKCS#7證書。X.509證書是最經(jīng)常使用的證書,它僅包含了公鑰信息而沒有私鑰信息,是可以公開進(jìn)行發(fā)布的,所以X.509證書對(duì)象一般都不需要加密。
- 一個(gè)OpenSSL簽發(fā)的經(jīng)過PEM編碼的X509證書看起來通常有如下的格式:
?
- 上述信息中,在“—BEGINCERTIFICATE—”和“—ENDCERTIFICATE—”之間就是PEM編碼的X.509證書。PEM編碼的數(shù)據(jù)信息總是包含在一對(duì)頭和尾組成的標(biāo)識(shí)符之間,對(duì)于X.509證書來說,
- 除了上述形式的頭尾格式,還可能出現(xiàn)以下兩種不同的標(biāo)識(shí)符:?
- 以上三種形式,OpenSSL都可以進(jìn)行正確的處理和解碼。
- 讀者可能還會(huì)在OpenSSL實(shí)際簽發(fā)的證書文件中最前面發(fā)現(xiàn)很多可讀的證書明文解釋,事實(shí)上,這些只是增加了證書文件的可讀性,并不代表真正的數(shù)據(jù)。在其他軟件中,比如Windows軟件,可能并不支持這些額外的明文信息,所以,先要將“—BEGINCERTIFICATE—”之前的所有可讀信息去掉。刪除這些信息的方法很多,最簡(jiǎn)單的是手動(dòng)刪除。
- 此外,也可以使用x509指令,進(jìn)行PEM到PEM的證書格式轉(zhuǎn)換,就可以去除明文可讀信息。
- 在Windows平臺(tái),X.509證書文件的后綴名經(jīng)常是der,cer或者crt,都是可以被自動(dòng)識(shí)別的。當(dāng)然,對(duì)于OpenSSL來說,后綴名是沒有實(shí)際意義的。
- OpenSSL的指令x509提供了對(duì)X.509證書進(jìn)行格式轉(zhuǎn)換的方法,可以在DER,PEM和NET三種格式之間進(jìn)行轉(zhuǎn)換。?
PKCS#12證書
- PKCS#12證書不同于X.509證書,它可以包含一個(gè)或多個(gè)證書,并且還可以包含證書對(duì)應(yīng)的私鑰。OpenSSL對(duì)PKCS#12證書提供了支持,并且提供了專門用于處理PKCS#12證書的指令pkcs12。
- pkcs12指令可以將普通的X.509證書和私鑰封裝成PKCS#12證書,也可以將PKCS#12證書轉(zhuǎn)換成X.509證書,并提取出相應(yīng)的私鑰。
- 一般來說,PKCS#12證書的私鑰是經(jīng)過加密的,密鑰由用戶提供的口令產(chǎn)生。所以,無論在使用pkcs12指令編碼或者解碼PKCS#12證書的時(shí)候,一般都會(huì)要求用戶輸入密鑰口令。
- PKCS#12證書文件在Windows平臺(tái)和Mozila中支持的后綴名是p12或者pfx。如果要在IE或者M(jìn)ozila中正確使用自己的證書,那么一般來說都要求轉(zhuǎn)換成包含公鑰和私鑰的PKCS#12證書導(dǎo)入到相關(guān)軟件中。
PKCS#7
- PKCS#7可以封裝一個(gè)或多個(gè)X.509證書或者PKCS#6證書(PKCS#6是一種證書格式,但是并不經(jīng)常使用),并且可以包含CRL信息。PKCS#7證書也不包含私鑰信息,但是跟X.509證書不同的是,它可以包含多個(gè)證書,這就使得PKCS#7可以將驗(yàn)證證書需要的整個(gè)證書鏈上的證書都包含進(jìn)來,從而方便證書的發(fā)布和正確使用。
- OpenSSL提供了對(duì)PKCS#7格式文件的支持,并提供了crl2pkcs7和pkcs7兩個(gè)指令來生成和處理PKCS#7文件??梢允褂盟麄?cè)赬.509證書和PKCS#7證書之間進(jìn)行轉(zhuǎn)換和處理。
- PKCS#7文件在Windows平臺(tái)的合法后綴名是p7b。
密鑰編碼
- OpenSSL有多種形式的密鑰,很多情況下,需要把這些密鑰保存下來。OpenSSL提供了PEM和DER兩種編碼方式對(duì)這些要保存的密鑰進(jìn)行編碼,而且都提供了相關(guān)指令可以使用戶在這兩種格式之間進(jìn)行轉(zhuǎn)換。
- DER編碼存儲(chǔ)的密鑰文件是不可讀的,如果你樂意用文本編輯器打開它,那么將看到一些難以理解的符號(hào),然而這很正常,因?yàn)檫@是一個(gè)二進(jìn)制編碼的文件。
- PEM則不一樣,它要友好得多,因?yàn)?strong>PEM經(jīng)過BASE64編碼。用文本編輯器打開PEM編碼的密鑰文件,可以看到跟證書類似,它們真正的編碼都包含在類似于:
- ——BEGIN XXXXX——
- ——END XXXXX——
- 這樣一對(duì)符號(hào)內(nèi),使用某些OpenSSL指令的一些選項(xiàng)后,你也許會(huì)在這對(duì)符號(hào)之前看到一些明文的信息,這些信息是編碼內(nèi)容的明文解釋,并不是實(shí)際的數(shù)據(jù),你要關(guān)注和使用的就是上述特殊符號(hào)內(nèi)包含的內(nèi)容。
- 密鑰總的來說有兩種,一種是可以公開的(比如公開密鑰對(duì)的公鑰),一種是不能公開的(比如公開密鑰對(duì)的私鑰)。那么,反映在編碼上,有的密鑰文件就會(huì)需要加密,有的就不需要加密。
- 一個(gè)經(jīng)過加密的PEM編碼密鑰文件在上述的符號(hào)內(nèi)會(huì)增加一些頭信息,這就是在前面介紹的PEM編碼的頭信息,這時(shí)候就派上用場(chǎng)了。這些頭信息主要是為密鑰解密的時(shí)候提供有用的信息,包括標(biāo)記密鑰加密狀態(tài)、使用的加密算法及初始向量(對(duì)于塊加密算法來說)。
- 下面是一個(gè)經(jīng)過加密的RSA私鑰的PEM編碼文件的例子:
?
- 可以看到,上述的PEM編碼的是RSA私鑰(RSAPRIVATEKEY),該密鑰經(jīng)過了加密(ENCRYPTED),使用的加密算法是3DES的CBC方式(DES-EDE3-CBC),使用的IV向量是“86B0167E005535D2”。
- OpenSSL的指令提供了對(duì)密鑰加密的功能,并提供了多種可選的加密算法,這些算法都是對(duì)稱加密算法,比如DES和DES3等。OpenSSL的指令通常使用要求輸入口令的方式來生成用來加密密鑰數(shù)據(jù)的密鑰,這里的口令并非直接用來作為加密的密鑰,而是根據(jù)這個(gè)口令使用一系列HASH操作來生成一個(gè)用于加密密鑰數(shù)據(jù)的密鑰。在讀取這類加密的密鑰文件的時(shí)候,OpenSSL的指令同樣會(huì)要求你輸入用于解密的口令,當(dāng)然,這個(gè)口令跟你加密密鑰時(shí)輸入的口令應(yīng)該是一致的。
- OpenSSL對(duì)某些類型的密鑰也提供了一些標(biāo)準(zhǔn)的封裝格式,如PKCS#8和PKCS#12格式。PKCS#8是用于封裝需要保密的密鑰的規(guī)范格式,OpenSSL提供了pkcs8的指令來處理這類格式的文件。事實(shí)上,PKCS#12對(duì)密鑰的封裝就是采用了PKCS#8的格式。OpenSSL有各種各樣的密鑰類型需要采用上述方法進(jìn)行編碼,比如RSA的公鑰和私鑰、DSA的公鑰和私鑰、DH密鑰參數(shù),等等,它們的形式基本上是一樣的。
- 當(dāng)然,無論采用什么加密方式對(duì)密鑰進(jìn)行加密保存,以文件形式存儲(chǔ)的密鑰其安全性總是不可靠的,更值得信賴和推薦的方式是將密鑰存儲(chǔ)在不可導(dǎo)出的密鑰設(shè)備中,比如USBKey、SmartCard和加密機(jī)等硬件設(shè)備中,這些設(shè)備內(nèi)部能夠完成加密操作,所以不需要將密鑰取出,這增加了密鑰的安全性。
?其他編碼
- 證書吊銷列表(CRL)是用戶驗(yàn)證證書的重要參考資料,它主要包含了無效的證書列表,告訴用戶哪些證書是已經(jīng)吊銷或無效的。當(dāng)然,如果沒有CRL,或許你可以選擇另一種驗(yàn)證方式,那就是使用在線證書服務(wù)協(xié)議(OCSP)。但不幸的是,OCSP并不總是能夠使用,比如你的網(wǎng)絡(luò)有時(shí)候可能不能接通OCSP服務(wù)器,那么你就要自行解決這個(gè)問題了。
- CRL是一種相對(duì)方便和獨(dú)立的解決方案,只要獲取了CA中心提供的在有效期內(nèi)的CRL,基本上就能對(duì)證書的有效性進(jìn)行驗(yàn)證。OpenSSL提供CRL文件的生成、解釋及格式轉(zhuǎn)換等。
- PEM格式編碼的CRL一般包含在如下的一對(duì)符號(hào)內(nèi):
- ——BEGIN X.509 CRL——
- ——END X.509 CRL——
- 當(dāng)然,還可以使用DER格式保存CRL。OpenSSL的指令提供了在PEM和DER之間對(duì)CRL進(jìn)行格式轉(zhuǎn)換的功能。此外,你也可以把CRL和證書一起封裝成PKCS#7格式,使用的指令是crl2pkcs7。
- OpenSSL還包含了其他一些可以使用PEM編碼的有趣對(duì)象,當(dāng)然,你可能永遠(yuǎn)不需要使用這些對(duì)象。SSL協(xié)議的Session對(duì)象是其中之一,它可以被編碼成PEM格式,然后你可以使用OpenSSL的指令將它解釋成可以查看的明文。Session對(duì)象處理的指令是ses_id。
- OpenSSL還支持對(duì)Netscape證書序列格式(NSEQ)的PEM編碼和解釋,相應(yīng)的指令是nseq。
?
總結(jié)
以上是生活随笔為你收集整理的密码学专题 文件编码格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html文档定义层标记是,jsp练习题目
- 下一篇: Qt 相对位置,绝对位置之间的转换(ma