SSL證書(1)

Public-Key Cryptography Standards (PKCS)是由美國RSA數據安全公司及其合做夥伴制定的一組公鑰密碼學標準,其中包括證書申請、證書更新、證書做廢表發佈、擴展證書內容以及數字簽名、數字信封的格式等方面的一系列相關協議。安全

RSA公鑰包括兩部分modules 和publicExponent,是兩個正整數,用n和e表示,網絡

在PKCS中是以ANS.1的語法定義的。以下所示,SEQUENCE是一個有序序列,序列包括兩個元素,皆爲正整數,用INTEGER表示。編碼

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

ANS.1只是抽象的語法表示,須要採用特定的編碼規則保存下來,這裏經常使用的是DER編碼,DER編碼採用TVL三元組(tag-length-value)來表達。code

30:06:02:01:11:02:01:11(十六進制表示)  這8個字節就能夠表示一個簡單到極點的RSA公鑰的格式。30是一個tag,表示一個SEQUENCE,06是後面值的長度。02是tag表明整數,01指一個字節,value是17,,固然實際的證書不可能這麼短。qt

DER編碼成二進制的字節流就能夠做爲公鑰文件保存了,這就是DER格式的文件。可是這種形式很不直觀,不太方便在網絡上傳輸,因而人們對這種二進制的文件進行base64編碼,再添加一些額外的頭部尾部,就成了PEM格式的文件。base64

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbTzz3OkCxoYe+8tqo1vLnv9I8
2cylAun523hbS9XIDzcheoEX+T5kRb+dkMc2OcGFHK1nD0vwVP+/OThxMtlxE3T5
JwOfKhgkIINdoaQqtINFuW8veC8dwDGOIYNqYXG98PYSA7pviZCshoZpkoU17Pnc
8k/WbUYepf8Y27gsRQIDAQAB
-----END PUBLIC KEY-----

這是一個PEM格式的RSA公鑰文件,頭部和尾部的BEGIN END是很明顯的PEM格式,代表這是一個RSA公鑰,中間的數據是base64編碼的,base64編碼的64個字符是A-Za-z0-9+/。換行只是爲了展現方便添加的,沒有實際意義。module

去掉----BEGIN PUBLIC KEY---- 和-----END PUBLIC KEY-----,對中間的內容進行base64解碼,以下所示。擴展

\x30 \x81 \x9f 

  \x30 \x0d 
     \x06 \x09 
          \x2a \x86 \x48 \x86 \xf7 \x0d \x01 \x01 \x01 
     \x05 \x00 
  \x03 \x81
       \x8d \x00
  \x30 \x81 \x89 
       \x02 \x81 \x81
            \x00 \xdb \x4f \x3c 
            \xf7 \x3a \x40 \xb1 \xa1 \x87 \xbe \xf2 
            \xda \xa8 \xd6 \xf2 \xe7 \xbf \xd2 \x3c 
            \xd9 \xcc \xa5 \x02 \xe9 \xf9 \xdb \x78 
            \x5b \x4b \xd5 \xc8 \x0f \x37 \x21 \x7a 
            \x81 \x17 \xf9 \x3e \x64 \x45 \xbf \x9d 
            \x90 \xc7 \x36 \x39 \xc1 \x85 \x1c \xad 
            \x67 \x0f \x4b \xf0 \x54 \xff \xbf \x39 
            \x38 \x71 \x32 \xd9 \x71 \x13 \x74 \xf9 
            \x27 \x03 \x9f \x2a \x18 \x24 \x20 \x83 
            \x5d \xa1 \xa4 \x2a \xb4 \x83 \x45 \xb9 
            \x6f \x2f \x78 \x2f \x1d \xc0 \x31 \x8e 
            \x21 \x83 \x6a \x61 \x71 \xbd \xf0 \xf6 
            \x12 \x03 \xba \x6f \x89 \x90 \xac \x86 
            \x86 \x69 \x92 \x85 \x35 \xec \xf9 \xdc 
            \xf2 \x4f \xd6 \x6d \x46 \x1e \xa5 \xff 
            \x18 \xdb \xb8 \x2c \x45 
       \x02 \x03 
            \x01 \x00 \x01

這裏用十六進制表示,如前面所述,最開始的x30是tag表示後面是一個序列,長度比較特殊,x81表示後面的長度用一個字節表示, 爲x9f.語法

主要關注最後一個序列x30 x81 x89。這個序列有兩個元素,一個整數長度x81,即129個字節。後一個也是整數, 長度爲3,值爲x010001即65537,。這兩個就是RSA公鑰的兩個參數。二進制

RSA密鑰爲1024位,應該佔128個字節,由於整數有正負,最高位爲1時爲負數。這裏在最前方增長一個x00,表示是正整數,因此長度是129字節

相關文章
相關標籤/搜索