1. 程式人生 > >對RFC系列文件中ASN.1 bitstring 編碼取值的解釋

對RFC系列文件中ASN.1 bitstring 編碼取值的解釋

        在RFC系列(https://www.ietf.org/rfc.html)文件中,對於資料的封裝格式,一般採用ASN.1編碼形式描述。這樣做的原因在於:ASN.1編碼是一種與軟硬體無關的資料格式定義方法,具有普適性。在前一篇博文中,介紹過ASN.1對bitstring型別的編碼方法,在本文中將舉例說明ASN.1 bitstring在RFC文件中的應用。
        在RFC5280 《Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile》中的4.2.1.3. Key Usage部分,使用bitstring型別描述金鑰用途,如下所示:
KeyUsage ::= BIT STRING {
  digitalSignature (0),
  nonRepudiation (1), -- recent editions of X.509 have
                                   -- renamed this bit to contentCommitment
  keyEncipherment (2),
  dataEncipherment (3),
  keyAgreement (4),
  keyCertSign (5),
  cRLSign (6),
  encipherOnly (7),
  decipherOnly (8) }
        位元串中不同位置的位元,如果值為1,表示具有該位元位對應的金鑰用途;如果值為0,表示不具備該位元位的金鑰用途。在上面的例子中,位元位從0開始計,位元位置與金鑰用途的對應關係如下圖:

        如果一張數字證書的金鑰用途是keyCertSign,則應將上圖中第5位元位的值設為1,那麼此時表示金鑰用途的位元串為{0, 0, 0, 0, 0, 1, 0, 0, 0}。由於一般使用DER編碼,要求當一個位元串作為編碼器的輸入時,其最後一個位元必須為1,所以需要去掉最後一個位元1之後的所有位元0,此時金鑰用途位元串的值應該表示為:{0, 0, 0, 0, 0, 1}。對這個位元串進行DER編碼,得到的編碼結果為:0x3  0x2  0x2  0x4,編碼過程如下圖:

        在Windows中檢視一張金鑰用途為keyCertSign的證書,顯示內容如下:

用Asn1View工具檢視這張證書的金鑰用途部分,顯示如下:

        同一張數字證書可能會具有多種金鑰用途,此時可能會有多個位元位的值為1。比如一張數字證書具有的金鑰用途包括以下幾種:digitalSignature,nonRepudiation,keyCertSign,cRLSign,使用位元串表示時應寫為:{1, 1, 0, 0, 0, 1, 1, 0, 0}。對這個位元串進行編碼的過程如下:

        在Windows中檢視一張金鑰用途包括digitalSignature,nonRepudiation,keyCertSign,cRLSign的證書,顯示內容如下:

        用Asn1View工具檢視這張證書的金鑰用途部分,顯示如下: