ANS.1結合CSR文件學習筆記


 

1.填充內容說明

CA證書申請CSR文件主要包括Common Name,Organization,Organizational Unit,City/Locality,State/County/Region,Country,Email address,Public Key,signature以上都是可變的填充內容,即不同申請用戶,填寫的內容不一樣。參考鏈接:

https://www.sslshopper.com/what-is-a-csr-certificate-signing-request.html

此外還有一些rsaEncryption,sha1WithRSAEncryption算法標識可以固定。

 

CSR文件的數據如下所示:

-----BEGIN CERTIFICATE REQUEST-----

MIICojCCAYoCAQAwLTENMAsGA1UEAxMEdmtleTENMAsGA1UECxMEdGVzdDENMAsGA1UEChMEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2HvmKZKcCLImxpwHprwl82S6y26MXGN+3WsRAfEmbKdjSRm9qQIR4V+AwO2DIRhc8PI47ZMJV0gwd7FQCnb9y6oRJwiKq5IWOdoZa+ZMTe0dn1bCH/0ib+BB6/IZdPrjGyhLB0hUgzryQQG7gIjz6ch1giNy2/6h5KOaS5CerLKLLsDRrCiXfWyN7GIP6RNuCsZGwiYQwf48ym56/UWyVS/TIMWdyZB7zQ0Eh1wCzLOkP7TE+DVmoLbT/f0cpqxQuDxZoyffdg5kEom0PubhCuII11mALIXx7wX8dE6RWB/syG2ZAEhLN3SFyZP8OGVOazfoFww1nepDmuDN8L2McCAwEAAaAwMC4GCSqGSIb3DQEJDjEhMB8wHQYDVR0OBBYEFLoMAZ+K8JaAVdIfAon6SZpD4MHHMA0GCSqGSIb3DQEBCwUAA4IBAQBCJGU8A75v1u1ylT4YxLNOGvsKfzGxg5SsSO+Ikdc3c1G99afRhl84sDAqAzXLdwMLTCX7G0tRGYK8fCVkED9AKNX+1enJNB8P3R0mWWuFkLmtOPEKhNrgaa+qYno0/KiRgjfLo1etwv/63LrQtMvUz28qNkX6ivkKvTsccX44kFv5CxmFJ95yVkEoAlKC5g6WDwx4tyWZykHQhdWGVtWE/3CB/Ba8wtcqJmHzW/NGvQD3JQKMv+HDZRk5bvgSor56+XH6p9UDqnRmz4sS/+x8b/vKYRkLPpSjLPgo5w4dfYoTIbZ9w83RcFUrNSxRY05CE8xCdyRd2cCgbnv1+X4K

-----END CERTIFICATE REQUEST-----

利用網站可以解析CSR文件得到ASN.1編碼文件。網址鏈接如下:

https://certlogik.com/decoder/

解析結果為:

Subject

RDN

Value

Common Name (CN)

testcert.redkestrel.co.uk

Organization (O)

Red Kestrel Consulting Ltd

Locality (L)

Stoke on Trent

State (ST)

Staffordshire

Country (C)

GB

Properties

Property

Value

Subject

CN = testcert.redkestrel.co.uk,O = Red Kestrel Consulting Ltd,L = Stoke on Trent,ST = Staffordshire,C = GB

Key Size

2048 bits

Fingerprint (SHA-1)

2E:7E:41:27:0F:E0:D9:A8:E4:5E:68:DC:89:64:5F:A5:D0:FB:47:BF

Fingerprint (MD5)

59:1D:E9:57:7B:AE:BA:18:FE:E6:A6:CC:14:AC:C4:2C

SANS

 

CSR Detailed Information

    Certificate Request:

    Data:

        Version: 0 (0x0)

        Subject:

            commonName                = testcert.redkestrel.co.uk

            organizationName          = Red Kestrel Consulting Ltd

            localityName              = Stoke on Trent

            stateOrProvinceName       = Staffordshire

            countryName               = GB

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

                Public-Key: (2048 bit)

                Modulus:

                    00:d6:2d:e5:bc:f0:87:80:21:ad:e7:db:74:7d:f6:

                    2f:3b:e1:f8:74:8d:eb:5f:f9:24:ec:18:f8:24:7c:

                    65:c6:27:ef:ad:72:52:86:93:73:09:13:48:a3:0f:

                    83:cd:6b:11:97:50:23:54:2e:09:f6:44:ec:b2:6e:

                    6e:6c:4e:61:b3:a4:43:83:fb:50:00:03:25:7e:a4:

                    b4:28:14:d9:07:10:5b:ae:74:6a:95:33:a5:e4:3d:

                    67:ea:68:cd:af:2a:f7:73:51:b3:cf:0b:45:ff:31:

                    f0:c5:18:fc:5c:f0:06:37:4d:43:37:f3:97:3d:73:

                    df:d6:38:81:7a:35:47:00:bc:01:48:40:5d:33:1b:

                    b7:af:cc:96:41:a8:36:f8:7a:75:27:6a:d3:12:2c:

                    79:b1:45:63:22:d4:97:87:b5:f2:c8:35:78:4d:8a:

                    d1:de:c0:44:16:80:80:77:8f:5c:66:87:b0:8f:3b:

                    91:5e:4d:be:87:cd:00:f1:73:e7:fb:b8:c8:ac:63:

                    ab:3d:27:f3:e1:dc:67:8e:09:e2:03:a2:8a:94:f2:

                    39:df:57:97:86:13:32:0c:1f:90:85:31:98:da:8e:

                    b3:4a:17:80:d8:2b:76:11:c9:42:34:2b:ae:be:bf:

                    42:88:2e:85:27:b4:4b:3e:f8:cd:b4:2e:13:a7:f9:

                    51:3d

                Exponent: 65537 (0x10001)

        Attributes:

            a0:00

    Signature Algorithm: sha1WithRSAEncryption

         51:61:3b:a0:15:f7:48:b8:d8:34:ce:77:6e:c0:4e:94:d1:a7:

         b2:00:29:d4:fd:5f:88:23:e9:10:a6:99:18:43:94:27:6c:4e:

         82:e2:07:4a:ed:4d:d5:98:a0:2a:95:a6:88:00:19:c6:ea:1a:

         81:6d:51:fc:03:4c:de:35:e9:bc:22:d5:05:1b:f8:d0:01:c2:

         16:ca:2d:f6:e7:6b:74:26:23:23:8d:da:0c:70:1a:62:f2:e6:

         4f:8f:cf:be:99:ed:72:7d:3f:ef:e8:3f:fd:e9:40:1e:1a:fd:

         50:8a:28:31:9c:30:c2:8e:b2:a2:6e:bb:27:07:f0:fd:b7:bf:

         83:b3:1a:7b:b9:8f:1d:9d:a5:b1:04:d2:d3:68:44:7a:a5:72:

         9c:84:64:d9:6f:66:79:05:0b:ae:df:bf:6a:da:20:d2:6a:89:

         48:1c:74:5a:cc:2d:1e:58:93:73:e9:d7:16:94:2b:c0:52:04:

         cd:5b:8f:18:23:95:c3:b2:e6:09:f3:66:1c:d0:a4:65:5b:91:

         48:90:7f:f4:c7:4b:9a:b7:f0:72:13:c8:dc:d7:93:19:27:be:

         05:97:ec:3a:da:6d:db:fe:e3:f9:ba:9e:60:a1:6e:f0:1d:2c:

         b4:ba:09:04:49:e2:87:15:28:57:5f:2e:64:e9:8e:7a:e5:6e:

         5f:53:7a:9c

(類型偏移量)(類型包含數據量)  

CSR ASN.1 Information

  0 717: SEQUENCE {

  4 437:   SEQUENCE {

  8   1:     INTEGER 0

 11 135:     SEQUENCE {

 14  11:       SET {

 16   9:         SEQUENCE {

 18   3:           OBJECT IDENTIFIER countryName (2 5 4 6)

 23   2:           PrintableString 'GB'

       :           }

       :         }

 27  22:       SET {

 29  20:         SEQUENCE {

 31   3:           OBJECT IDENTIFIER stateOrProvinceName (2 5 4 8)

 36  13:           PrintableString 'Staffordshire'

       :           }

       :         }

 51  23:       SET {

 53  21:         SEQUENCE {

 55   3:           OBJECT IDENTIFIER localityName (2 5 4 7)

 60  14:           PrintableString 'Stoke on Trent'

       :           }

       :         }

 76  35:       SET {

 78  33:         SEQUENCE {

 80   3:           OBJECT IDENTIFIER organizationName (2 5 4 10)

 85  26:           PrintableString 'Red Kestrel Consulting Ltd'

       :           }

       :         }

113  34:       SET {

115  32:         SEQUENCE {

117   3:           OBJECT IDENTIFIER commonName (2 5 4 3)

122  25:           PrintableString 'testcert.redkestrel.co.uk'

       :           }

       :         }

       :       }

149 290:     SEQUENCE {

153  13:       SEQUENCE {

155   9:         OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)

166   0:         NULL

       :         }

168 271:       BIT STRING

       :         30 82 01 0A 02 82 01 01 00 D6 2D E5 BC F0 87 80

       :         21 AD E7 DB 74 7D F6 2F 3B E1 F8 74 8D EB 5F F9

       :         24 EC 18 F8 24 7C 65 C6 27 EF AD 72 52 86 93 73

       :         09 13 48 A3 0F 83 CD 6B 11 97 50 23 54 2E 09 F6

       :         44 EC B2 6E 6E 6C 4E 61 B3 A4 43 83 FB 50 00 03

       :         25 7E A4 B4 28 14 D9 07 10 5B AE 74 6A 95 33 A5

       :         E4 3D 67 EA 68 CD AF 2A F7 73 51 B3 CF 0B 45 FF

       :         31 F0 C5 18 FC 5C F0 06 37 4D 43 37 F3 97 3D 73

       :                 [ Another 142 bytes skipped ]

       :       }

443   0:     [0]

       :       Error: Object has zero length.

       :     }

445  13:   SEQUENCE {

447   9:     OBJECT IDENTIFIER sha1WithRSAEncryption (1 2 840 113549 1 1 5)

458   0:     NULL

       :     }

460 257:   BIT STRING

       :     51 61 3B A0 15 F7 48 B8 D8 34 CE 77 6E C0 4E 94

       :     D1 A7 B2 00 29 D4 FD 5F 88 23 E9 10 A6 99 18 43

       :     94 27 6C 4E 82 E2 07 4A ED 4D D5 98 A0 2A 95 A6

       :     88 00 19 C6 EA 1A 81 6D 51 FC 03 4C DE 35 E9 BC

       :     22 D5 05 1B F8 D0 01 C2 16 CA 2D F6 E7 6B 74 26

       :     23 23 8D DA 0C 70 1A 62 F2 E6 4F 8F CF BE 99 ED

       :     72 7D 3F EF E8 3F FD E9 40 1E 1A FD 50 8A 28 31

       :     9C 30 C2 8E B2 A2 6E BB 27 07 F0 FD B7 BF 83 B3

       :             [ Another 128 bytes skipped ]

       :   }

2.ANS.1編碼的規則介紹

這邊先簡單介紹下ANS.1編碼的規則。ANS.1采取的是類似於TLV的格式,即tag標識+length數據長度+Value內容。

1.數據類型標識:

證書中主要涉及到兩種ANS.1數據類型,一個是容器(container)

容器是值一個包含了其他相同或者不同類型元素的數據類型(例如序列值SEQUENCE或集合值SET類型).目的是為了組合一些復雜的數據類型集.ASN.1規范定義了4種容器類型:序列(SEQUENCE標識30),單一序列(SEQUENCE OF),集合(SET標識31)和單一集合(SET OF)。證書文件目前主要用到SEQUENCE和SET類型。

一個是數據類型,主要包括以下數據類型。

代碼

ASN.1類型

作用

1(0x01)

布爾型

儲存布爾值

2(0x02)

整數

儲存大整數

3(0x03)

位串

存儲位數組

4(0x04)

八位位串

存儲字節數組

5(0x05)

預留位(例如在選擇修改器中)

6(0x06)

對象標識符

標識算法及協議

16(0x10)

序列和單一序列

未分類元素的容器

17(0x11)

集合和單一集合

已分類元素的容器

19(0x13)

可打印字符串

ASCII編碼(忽略一些不可打印字符)

22(0x16)

IA5String

ASCII編碼

23(0x17)

世界協調時

以統一格式表示的時間

2.數據長度

       編碼字節的最高位代表的是短編碼還是長編碼;而低7位則形成一個長度立即數。
(1)短編碼。
        在短編碼中,負載的長度必須小於128字節。長度立即數用來表示負載的長度。例如,對於一個長度為65 (0x41)的負載進行編碼,其長度編碼字節只需簡單的設置為0x41即可。因為其最高位是0,則編碼器可以判斷出這是短編碼,而且長度是65。
(2) 長編碼。
        在長編碼中,定義了附加的抽象數據來對長度進行編碼,它僅適用於所有長度為128字節或以上的負載。在這種模式下,長度立即數存儲的是為了表示負載長度所需的字節數。這個長度必須以big-endian格式進行編碼。(其實big endian是指低地址存放最高有效字節(MSB),而little endian則是低地址存放最低有效字節(LSB)。)。
         例如,為一個長度為47310 (0xB8CE)的負載進行編碼,因為它的長度大於127, 所以要采用長編碼方式。實際的長度需要兩個字節來表示。則,長度編碼字節為0x82; 然后用big-endian格式存儲的長度值為0xB8 0xCE。則全部長度編碼為 0x82 B8 CE。

3.數據類型介紹

1.整型(INTEGER)

整數類型表示一個有符號的任意精度的標量,它的編碼是可移植,平台無關的。正整數的編碼比較簡單。每個字節表示的最大整數是255 (0xFF), 存儲的實際數值分成字節大小的數字,並且以big-endian格式存儲。例如:

八位位組{Xk, Xk-1,...., X0}將以遞減的順序從Xk到X0進行存儲.編碼規定正整數的第一個字節的最高位必須是0,即Xk的最高為必須是0,為1的話則為負數.例如: x = 49468= 193 * 256 + 60 = 0xC1 * 0x FF + 0x3C; 即X1=0xC1, X0 = 0x3C. 按正常規定,編碼應該是 0x02 02 C1 3C, 但是X1的最高位是1, 應該被看成負數.最簡單的方法是用前端零字節進行填充.編碼變為 0x02 02 00 C1 3C。
    負整數的編碼有些復雜.要先找到一個最小的256的冪,使它比要編碼的負數的絕對值還要大。例如:x = - 1555;被1555大的256的最小的冪是256^2 = 65536;然后將這個數跟負數相加以得到2的補碼。65536 + (-1555) = 63981 =  0xF9 * 0xFF + 0x ED,則編碼為 0x02 02 F9 ED。

2.對象標識符 (OBJECT Identifier,OID)

對象標識符(OBJECT IDENTIFIER, OID)類型用層次的形式來表示標准規范.標識符樹通過一個點分的十進制符號來定義,這個符號以組織,子部分然后是標准的類型和各自的子標識符開始.
      例如:MD5的OID 是 1.2.840.113549.2.5  表示為"iso(1) member-body (2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)", 所以當解程序看到這個OID時,就知道是MD5散列.
      OID在公鑰算法標准中很流行,它指出證書綁定了哪種散列算法. 同樣,也有公鑰算法,分組算法,和操作模式的OID. 它們是一種高效且可移植的表示數據包中所選算法的形式.
      對OID的編碼規則: 
前兩部分如果定義為x.y, 那么它們將合成一個字40*x + y, 其余部分單獨作為一個字節進行編碼.
每個字首先被分割為最少數量的沒有頭零數字的7位數字.這些數字以big-endian格式進行組織,並且一個接一個地組合成字節. 除了編的最后一個字節外,其他所有字節的最高位(位8)都為1.
     舉例: 30331 = 1 * 128^2 + 108 * 128 + 123  分割成7位數字(0x80)后為{1,108,123}設置最高位后變成{129,236,123}.如果該字只有一個7位數字,那么最高為0.
     MD5 OID的編:

1. 將1.2.840.113549.2.5轉換成字數組 {42, 840, 113549, 2, 5}。
2. 然后將每個字分割為帶有最高位的7位數字,{{0x2A},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}。
3. 最后完整的編為 0x06 08 2A 86 48 86 F7 0D 02 05。

3. 可打印字符串和IA5String類型

可打印字符串(PrintableString)和IA5String類型定義了一種獨立於本地代頁和字符集定義,在任何平台上都可以將ASCII字符串編為可讀字符串的可移植方法.
    可打印字符串對象是ASCII集合的一個有限子集,這個子集包括32,39,40~41,43~58,61,63以及65~122.
       IA5String類型的編對象是ASCII集合中的大多數.包括NULL,BEL,TAB,NL,LF,CR以及32~126.
       可打印字符串和IA5String的編和八位位組串相似.可打印字符串的頭字節是0x13, IA5String的是0x16. 例如:"Hello World"的編為0x13 0B 48 65 6D 6D 6F 20 57 6F 72 6D 64。4. 位串類型

      位串(BIT STRING)類型以可移植形式表示位數組。除了ASN.1頭部兩個字節之外,還有一個附加的頭部用來表示填充數據(通常是一個字節,因為填充是為了形成一個完整的字節)。編碼規則:位串的第一位放到第一個負載字節的第8位;位串的第二位放到第一個負載字節的第7位;依此類推。填充滿第一個負載字節,就繼續填充第二個負載字節。如果最后一個負載字節未被填充滿,空的位用0來填充,0的個數存放到頭部用來表示填充數據的那個字節里。

下面舉例說明:

有一個位串{1,0,0,0,1,1,1,0,1,0,0,1},開始填充負載字節。第一個字節填充后為10001110 = 0x 8E;第二個字節填充后為10010000 = 0x90,低位4個0為填充的空位。則負載為2個字節加上表示填充0個數的一個字節0x04總共3個字節。則完整的編碼為:0x03 03 04 8E 90。

5. 空類型

     空(NULL)類型實際上是"占位符", 它是含有空白選項的選擇修改器所特有.例如:

          MyAccount ::= SEQUENCE {

                    Name                            IA5String,

                    Group                           IA5String,

                   Credentials                    CHOICE{

                                                              rsaKey           RSAPublicKey,

                                                              passwdHash  OCTET STRING,

                                                              none               NULL

                                                         }

           }

     在上面這個結構中,帳號的證書應該包含一個RSA密鑰或一個密碼散列值或什么都沒有。空類型的編碼是 0x05 00。

4.ASN.1編碼數據解析例子

上文提到的證書申請文件內容,經過base64解碼的16進制數據如下所示,經過ASN.1編碼標注。

30 82 02 cd (SEQUENCE : LENGTH(two byte): 02 cd >127 + ‘82’)

30 82 01 b5 (SEQUENCE : LENGTH(two byte): 01 b5 >127 + ‘82’)

02 01 00 (INTEGER : 0)

30 81 87 (SEQUENCE : LENGTH(one byte):87 >127 +‘81’)

31 0b (SET : LENGTH:0b <127)

30 09 (SEQUENCE : LENGTH:09 <127 )

06 03 55 04 06 (OBJECT IDENTIFIE countryName)

13 02 (PrintableString:LENGTH:02)

47 42 (GB)

31 16 (SET : LENGTH:16 <127)

30 14 (SEQUENCE : LENGTH:14 <127 )

06 03 55 04 08 (OBJECT IDENTIFIE stateOrProvinceName)

13 0d (PrintableString:LENGTH:0d)

53 74 61 66 66 6f 72 64 73 68 69 72 65 (Staffordshire)

 

31 17 (SET : LENGTH:17 <127)

30 15 (SEQUENCE : LENGTH:15 <127 )

06 03 55 04 07 (OBJECT IDENTIFIE localityName)

13 0e (PrintableString:LENGTH:0e)

53 74 6f 6b 65 20 6f 6e 20 54 72 65 6e 74(Stoke on Trent)

 

31 23 (SET : LENGTH:23 <127)

30 21 (SEQUENCE : LENGTH:21 <127 )

06 03 55 04 0a (OBJECT IDENTIFIE organizationName)

13 1a (PrintableString:LENGTH:1a)

52 65 64 20 4b 65 73 74 72 65 6c 20 43 6f 6e 73 (Red Kestrel Consulting Ltd)

75 6c 74 69 6e 67 20 4c 74 64

 

31 22 (SET : LENGTH:22 <127)

30 20 (SEQUENCE : LENGTH:20 <127 )

06 03 55 04 03 (OBJECT IDENTIFIE commonName)

13 19 (PrintableString:LENGTH:19)

74 65 73 74 63 65 72 74 2e 72 65 64 6b 65 73 74 (testcert.redkestrel.co.uk)

72 65 6c 2e 63 6f 2e 75 6b

 

30 82 01 22 (SEQUENCE : LENGTH(two byte): 01 22 >127 + ‘82’)

30 0d (SEQUENCE : LENGTH:0d <127 )

06 09 2a 86 48 86 f7 0d 01 01 01 (OBJECT IDENTIFIER rsaEncryption)

05 00 (NULL)

 

03 82 01 0f (BIT STRING: LENGTH(two byte): 01 0f >127 + ‘82’)

00(表示位串末字節填充0的個數)

30 82 01 0a(SEQUENCE : LENGTH(two byte): 01 0a >127 + ‘82’)

02 82 01 01 (INTEGER : LENGTH(two byte): 01 01 >127 + ‘82’)

00 (正整數標識)

d6 2d e5 bc f0 87 80 21 ad e7 db 74 7d f6 2f 3b

e1 f8 74 8d eb 5f f9 24 ec 18 f8 24 7c 65 c6 27

ef ad 72 52 86 93 73 09 13 48 a3 0f 83 cd 6b 11

97 50 23 54 2e 09 f6 44 ec b2 6e 6e 6c 4e 61 b3

a4 43 83 fb 50 00 03 25 7e a4 b4 28 14 d9 07 10

5b ae 74 6a 95 33 a5 e4 3d 67 ea 68 cd af 2a f7

73 51 b3 cf 0b 45 ff 31 f0 c5 18 fc 5c f0 06 37

4d 43 37 f3 97 3d 73 df d6 38 81 7a 35 47 00 bc

01 48 40 5d 33 1b b7 af cc 96 41 a8 36 f8 7a 75

27 6a d3 12 2c 79 b1 45 63 22 d4 97 87 b5 f2 c8

35 78 4d 8a d1 de c0 44 16 80 80 77 8f 5c 66 87

b0 8f 3b 91 5e 4d be 87 cd 00 f1 73 e7 fb b8 c8

ac 63 ab 3d 27 f3 e1 dc 67 8e 09 e2 03 a2 8a 94

f2 39 df 57 97 86 13 32 0c 1f 90 85 31 98 da 8e

b3 4a 17 80 d8 2b 76 11 c9 42 34 2b ae be bf 42

88 2e 85 27 b4 4b 3e f8 cd b4 2e 13 a7 f9 51 3d

02 03 (INTEGER : LENGTH 03)

01 00 01 (公鑰指數)

a0 00(??)

30 0d (SEQUENCE : LENGTH 0d)

06 09 2a 86 48 86 f7 0d 01 01 05(OBJECT IDENTIFIER sha1WithRSAEncryption)

05 00 (NULL)

03 82 01 01 (BIT STRING: LENGTH(two byte): 01 01 >127 + ‘82’)

00(表示位串末字節填充0的個數)

51 61 3b a0 15 f7 48 b8 d8 34 ce 77 6e c0 4e

94 d1 a7 b2 00 29 d4 fd 5f 88 23 e9 10 a6 99 18

43 94 27 6c 4e 82 e2 07 4a ed 4d d5 98 a0 2a 95

a6 88 00 19 c6 ea 1a 81 6d 51 fc 03 4c de 35 e9

bc 22 d5 05 1b f8 d0 01 c2 16 ca 2d f6 e7 6b 74

26 23 23 8d da 0c 70 1a 62 f2 e6 4f 8f cf be 99

ed 72 7d 3f ef e8 3f fd e9 40 1e 1a fd 50 8a 28

31 9c 30 c2 8e b2 a2 6e bb 27 07 f0 fd b7 bf 83

b3 1a 7b b9 8f 1d 9d a5 b1 04 d2 d3 68 44 7a a5

72 9c 84 64 d9 6f 66 79 05 0b ae df bf 6a da 20

d2 6a 89 48 1c 74 5a cc 2d 1e 58 93 73 e9 d7 16

94 2b c0 52 04 cd 5b 8f 18 23 95 c3 b2 e6 09 f3

66 1c d0 a4 65 5b 91 48 90 7f f4 c7 4b 9a b7 f0

72 13 c8 dc d7 93 19 27 be 05 97 ec 3a da 6d db

fe e3 f9 ba 9e 60 a1 6e f0 1d 2c b4 ba 09 04 49

e2 87 15 28 57 5f 2e 64 e9 8e 7a e5 6e 5f 53 7a

9c

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM