iOS安全之密碼學(xué)

前言

本文粗略的從字符、字符集、傳輸編碼、算法等概念梳理了密碼學(xué)基本的相關(guān)知識(shí)。特定算法的知識(shí)與使用方法,本文未做詳細(xì)介紹。
附帶Security Demo包括字符編碼、傳輸編碼、HASH、對(duì)稱加密、非對(duì)稱加密、密鑰交換等功能詳情見Github地址: iOS安全之密碼學(xué)

1、字符集與字符編碼(規(guī)則)

1.1 字符集(Charset)

字符集是一個(gè)系統(tǒng)支持的所有抽象字符的集合。字符是各種文字和符號(hào)的總稱,包括各國家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。

  • ASCII

  • 國標(biāo)系列GB2312、GB18030等

  • BIG5

  • Unicode

1.2 字符編碼(規(guī)則)(Character Encoding)

字符編碼(規(guī)則)是一套法則,使用該法則能夠?qū)ψ匀徽Z言的字符的一個(gè)集合(如字母表或音節(jié)表),與其他東西的一個(gè)集合(如號(hào)碼或電脈沖)進(jìn)行配對(duì)。即在符號(hào)集合與數(shù)字系統(tǒng)之間建立對(duì)應(yīng)關(guān)系,它是信息處理的一項(xiàng)基礎(chǔ)技術(shù)。

  • ASCII

  • 國標(biāo)系列GB2312、GB18030等

  • BIG5

  • UTF-8、UTF-16、UTF-32

typedef NSUInteger NSStringEncoding;
NS_ENUM(NSStringEncoding) {
    NSASCIIStringEncoding = 1, /* 0..127 only */
    NSNEXTSTEPStringEncoding = 2,
    NSJapaneseEUCStringEncoding = 3,
    NSUTF8StringEncoding = 4,
    NSISOLatin1StringEncoding = 5,
    NSSymbolStringEncoding = 6,
    NSNonLossyASCIIStringEncoding = 7,
    NSShiftJISStringEncoding = 8,          /* kCFStringEncodingDOSJapanese */
    NSISOLatin2StringEncoding = 9,
    NSUnicodeStringEncoding = 10,
    NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
    NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
    NSWindowsCP1253StringEncoding = 13,    /* Greek */
    NSWindowsCP1254StringEncoding = 14,    /* Turkish */
    NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
    NSISO2022JPStringEncoding = 21,        /* ISO 2022 Japanese encoding for e-mail */
    NSMacOSRomanStringEncoding = 30,
    NSUTF16StringEncoding = NSUnicodeStringEncoding,      /* An alias for NSUnicodeStringEncoding */
    NSUTF16BigEndianStringEncoding = 0x90000100,          /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF16LittleEndianStringEncoding = 0x94000100,      /* NSUTF16StringEncoding encoding with explicit endianness specified */
    NSUTF32StringEncoding = 0x8c000100,                 
    NSUTF32BigEndianStringEncoding = 0x98000100,          /* NSUTF32StringEncoding encoding with explicit endianness specified */
    NSUTF32LittleEndianStringEncoding = 0x9c000100        /* NSUTF32StringEncoding encoding with explicit endianness specified */
};

1.3 ASCII ((American Standard Code for Information Interchange): 美國信息交換標(biāo)準(zhǔn)代碼)

ASCII是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是最通用的信息交換標(biāo)準(zhǔn)。

ASCII范圍 0x00 - 0x7f

擴(kuò)展ASCII范圍 0x80 - 0xff

Bin(二進(jìn)制) Dec(十進(jìn)制) Hex(十六進(jìn)制) 縮寫/字符 解釋
0000 0000 0 0x00 NUL(null) 空字符
0000 0001 1 0x01 SOH(start of headline) 標(biāo)題開始
0000 0010 2 0x02 STX (start of text) 正文開始
0000 0011 3 0x03 ETX (end of text) 正文結(jié)束
0000 0100 4 0x04 EOT (end of transmission) 傳輸結(jié)束
~~~ ~~~ ~~~ ~~~ ~~~
~~~ ~~~ ~~~ ~~~ ~~~
0011 0000 48 0x30 0 字符0
0011 0001 49 0x31 1 字符1
0011 0010 50 0x32 2 字符2
0011 0011 51 0x33 3 字符3
0011 0100 52 0x34 4 字符4
~~~ ~~~ ~~~ ~~~ ~~~
~~~ ~~~ ~~~ ~~~ ~~~
0100 0001 65 0x41 A 大寫字母A
0100 0010 66 0x42 B 大寫字母B
0100 0011 67 0x43 C 大寫字母C
0100 0100 68 0x44 D 大寫字母D
0100 0101 69 0x45 E 大寫字母E
~~~ ~~~ ~~~ ~~~ ~~~
~~~ ~~~ ~~~ ~~~ ~~~
0111 1000 120 0x78 x 小寫字母x
0111 1001 121 0x79 y 小寫字母y
0111 1010 122 0x7A z 小寫字母z
0111 1011 123 0x7B { 開花括號(hào)
0111 1100 124 0x7C | 垂線
0111 1101 125 0x7D } 閉花括號(hào)
0111 1110 126 0x7E ~ 波浪號(hào)
0111 1111 127 0x7F DEL (delete) 刪除

1.4 Unicode字符集

Unicode(統(tǒng)一碼、萬國碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。容納世界上所有語言字符和符號(hào)的集合它為每種語言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。

Unicode 全稱學(xué)名是Universal Multiple-Octet Coded Character Set,簡稱為UCS。

廣義的 Unicode 是一個(gè)標(biāo)準(zhǔn),定義了一個(gè)字符集以及一系列的編碼規(guī)則,即 Unicode 字符集和UTF-8、UTF-16、UTF-32等等編碼規(guī)則;

Unicode是定長的都為雙字節(jié)。

Unicode編碼目前規(guī)劃的總空間是17個(gè)平面,0x0000 至 0x10FFFF。每個(gè)平面有 65536 個(gè)碼點(diǎn)。理論上這個(gè)總的長度有1114112個(gè)。目前已收錄14萬+字符。

1990年開始研發(fā),1994年正式發(fā)布1.0版本,2005年3月發(fā)布4.1版本,2020年發(fā)布13.0版本。

1.5 UTF-8

UTF-8是Unicode的編碼規(guī)則之一,最常用編碼規(guī)則。(UTF是“UCS Transformation Format”的縮寫)

舉個(gè)栗子:wallyt海付

查詢Unicode字符集是這樣的編碼表:

字符 Unicode 編碼表(十六進(jìn)制) UCS-2
w 0077 00000000 01110111
a 0061 00000000 01100001
l 006c 00000000 01101100
l 006c 00000000 01101100
y 0079 00000000 01111001
t 0074 00000000 01110100
6d77 01101101 01110111
4ed8 01001110 11011000

UTF-8編碼規(guī)則:

  1. 單字節(jié)的字符,字節(jié)的第一位設(shè)為0,和ASCII碼完全相同;'\u0000'到'\u007F'對(duì)應(yīng)全部128個(gè)ACSII字符。

  2. n個(gè)字節(jié)的字符(n>1),第一個(gè)字節(jié)的前n位設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10,這n個(gè)字節(jié)的其余空位填充該字符unicode碼,高位用0補(bǔ)足。

UCS-2 UTF-8
U-00000000 - U-0000007F 0xxxxxxx
U-00000080 - U-000007FF 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

2、傳輸編碼方式 -- Base64 編碼

2.1 認(rèn)識(shí)Base64編碼

字符到二進(jìn)制,二進(jìn)制到字符。

二進(jìn)制到字符,字符到二進(jìn)制。

計(jì)算機(jī)中很多數(shù)據(jù)是只能通過可見字符去傳輸

1、網(wǎng)站網(wǎng)址;

2、一些面向字符的網(wǎng)絡(luò)協(xié)議如SMTP等;

3、圖片、音視頻等格式的文件傳輸;

4、幀定界相關(guān)等

這些情景有時(shí)由需要去傳輸二進(jìn)制數(shù)據(jù)?;谶@樣的需要,誕生了Base64。

Base64是網(wǎng)絡(luò)上最常見的用于傳輸 8Bit字節(jié)代碼的編碼方式之一,它的目的是基于64個(gè)ASCII中定義的可見字符去表示任意的二進(jìn)制數(shù)據(jù)。

64個(gè)可打印的字符組成的序列如下所示:

大寫字母、小寫字母、 數(shù)字、 +/

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

日常使用中我們會(huì)看到=或者==出現(xiàn)在Base64編碼結(jié)果中,其=在此是做為填充符號(hào)。

2.2 Base64編碼原理

使用4個(gè)字節(jié)的文本來表示3個(gè)字節(jié)的原始二進(jìn)制數(shù)據(jù)。

38 = 46 = 24

具體轉(zhuǎn)換步驟

  • 第一步,將待轉(zhuǎn)換的字符串每三個(gè)字節(jié)分為一組,每個(gè)字節(jié)占8bit,那么共有24個(gè)二進(jìn)制位。

  • 第二步,將上面的24個(gè)二進(jìn)制位每6個(gè)一組,共分為4組。

  • 第三步,在每組前面添加兩個(gè)0,每組由6個(gè)變?yōu)?個(gè)二進(jìn)制位,總共32個(gè)二進(jìn)制位,即四個(gè)字節(jié)。

  • 第四部,轉(zhuǎn)換成基于64個(gè)ASCII中定義的可見字符

  • 其中第二步每6位一組不夠6位時(shí),后面補(bǔ)0。

  • 其中每6位一組完全沒有數(shù)據(jù)時(shí),使用=做填充復(fù)合。

二進(jìn)制數(shù)據(jù)11111111 11111111 11111111Base64編碼

字符ABase64編碼

字符Base64編碼

2.3 Base64編碼特性

1)可以將任意的二進(jìn)制數(shù)據(jù)進(jìn)行Base64編碼;

2)把3個(gè)字節(jié)變成4個(gè)字節(jié),數(shù)據(jù)編碼之后,數(shù)據(jù)量會(huì)變大,變大1/3左右;

3)每76個(gè)字符加一個(gè)換行符,最后的結(jié)束符也要處理;

4)Base64編碼具有不可讀性;

5)Base64正向編碼后,可進(jìn)行反向解碼。

Base64算不上是一種“加密算法”,Base64可以成為密碼學(xué)的‘基石’。

3、HASH算法

散列算法,也不是一種“加密算法”。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。

特點(diǎn):

  • 正向快速

  • 逆向困難

  • 輸入敏感

  • 沖突避免

原理:明文通過復(fù)雜公式計(jì)算得出的結(jié)果。

目前常見且流行的 Hash 算法: MD5、SHA-1 和 SHA-2(Secure Hash Algorithm)

其中MD5、SHA-1 被“破解” 、已被證明不具備”強(qiáng)抗碰撞性”。 推薦至少使用SHA2-256算法

HASH算法在密碼學(xué)中的應(yīng)用:加簽加鹽,簽名驗(yàn)證

HASH算法在管理數(shù)據(jù)結(jié)構(gòu)中的應(yīng)用:Java Hashmap 、Android Sparse Array 、iOS NSHashMap

4、加密算法

保密性:防止用戶的標(biāo)識(shí)或數(shù)據(jù)被讀取。

數(shù)據(jù)完整性:防止數(shù)據(jù)被更改。

身份驗(yàn)證:確保數(shù)據(jù)發(fā)自特定的一方。

4.1加密與解密基本過程

整個(gè)加解密算法系統(tǒng)為 S = {P、C、K、E、D}

P - 明文數(shù)據(jù)(Plaintext)

C - 密文數(shù)據(jù)(Ciphertext)

K - 秘鑰(Key)

E - 加密算法(Encryption algorithms)

D - 解密算法(Decryption algorithms)

P * E * Ke = C

C * D * Kd = P

針對(duì)加解密算法的選擇,秘鑰的傳輸與存儲(chǔ)。展開討論。

4.2對(duì)稱加密

對(duì)稱加密:DES、3DES、AES

4.2.1 AES 高級(jí)加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES)

AES加密一般分為

1、流加密(如OFB、CFB等)

2、塊加密(如ECB、CBC等) (iOS推薦)

多種工作模式

enum {
kCCModeECB = 1,
kCCModeCBC = 2,
kCCModeCFB = 3,
kCCModeCTR = 4,
kCCModeOFB = 7,
kCCModeRC4 = 9,
kCCModeCFB8 = 10,
};

typedef uint32_t CCMode;

對(duì)于塊加密,如果加密超過塊大小的數(shù)據(jù),就需要涉及填充和鏈加密模式。


/*!

    @enum      CCOptions
    @abstract  Options flags, passed to CCCryptorCreate().
    @constant  kCCOptionPKCS7Padding  Perform PKCS7 padding.
    @constant  kCCOptionECBMode        Electronic Code Book Mode.
                                        Default is CBC.
*/
enum {
    /* options for block ciphers */
    kCCOptionPKCS7Padding  = 0x0001,
    kCCOptionECBMode        = 0x0002
    /* stream ciphers currently have no options */
};
typedef uint32_t CCOptions;

收單SPay使用CBC且自行paddingCBC中需要初始化向量IV

發(fā)卡錢包使用ECB

4.3 非對(duì)稱加密

RSA、Elgamal、背包算法、ECC(橢圓曲線加密算法)

4.4 RSA加密算法

最常見的非對(duì)稱加密算法。

4.4.1 算法基本原理

RSA原理是:根據(jù)數(shù)論,尋求兩個(gè)大素?cái)?shù)比較簡單,而將它們的乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰 。

4.4.2 數(shù)字證書與秘鑰

數(shù)字證書:常用版本X.509的 v3版本規(guī)范(RFC5280),由國際電信聯(lián)盟制定,內(nèi)容包括證書序列號(hào)、證書有效期公開密鑰等信息。

版本號(hào)(Version Number):規(guī)范的版本號(hào),目前為版本3,值為0x2;

序列號(hào)(Serial Number):由CA維護(hù)的為它所發(fā)的每個(gè)證書分配的一的列號(hào),用來追蹤和撤銷證書。只要擁有簽發(fā)者信息和序列號(hào),就可以唯一標(biāo)識(shí)一個(gè)證書,最大不能過20個(gè)字節(jié);

簽名算法(Signature Algorithm):數(shù)字簽名所采用的算法,如:

· sha256-with-RSA-Encryption

· ccdsa-with-SHA2S6;

頒發(fā)者(Issuer):發(fā)證書單位的標(biāo)識(shí)信息,如 ” C=CN,ST=Beijing, L=Beijing, O=org.example.com,CN=ca.org。example.com ”;

有效期(Validity): 證書的有效期很,包括起止時(shí)間。

主體(Subject) : 證書擁有者的標(biāo)識(shí)信息(Distinguished Name),如:" C=CN,ST=Beijing, L=Beijing, CN=person.org.example.com”;

主體的公鑰信息(SubJect Public Key Info):所保護(hù)的公鑰相關(guān)的信息:

· 公鑰算法 (Public Key Algorithm)公鑰采用的算法;

· 主體公鑰(Subject Unique Identifier):公鑰的內(nèi)容。

頒發(fā)者唯一號(hào)(Issuer Unique Identifier):代表頒發(fā)者的唯一信息,僅2、3版本支持,可選;

主體唯一號(hào)(Subject Unique Identifier):代表擁有證書實(shí)體的唯一信息,僅2,3版本支持,可選:

擴(kuò)展(Extensions,可選): 可選的一些擴(kuò)展。中可能包括:

· Subject Key Identifier:實(shí)體的秘鑰標(biāo)識(shí)符,區(qū)分實(shí)體的多對(duì)秘鑰;

· Basic Constraints:一指明是否屬于CA;

· Authority Key Identifier:證書頒發(fā)者的公鑰標(biāo)識(shí)符;

· CRL Distribution Points: 撤銷文件的頒發(fā)地址;

· Key Usage:證書的用途或功能信息。


-----BEGIN CERTIFICATE-----
MIIHJjCCBg6gAwIBAgIQAQV1J9uhA/WtTyocZe9DYTANBgkqhkiG9w0BAQsFADBN
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMjAwMjI3MDAwMDAwWhcN
MjEwMjI2MTIwMDAwWjCBmDELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcx
OTA3BgNVBAoTMEJlaUppbmcgQmFpZHUgTmV0Y29tIFNjaWVuY2UgVGVjaG5vbG9n
eSBDby4sIEx0ZDElMCMGA1UECxMcc2VydmljZSBvcGVyYXRpb24gZGVwYXJ0bWVu
dDEVMBMGA1UEAxMMd3d3LmJhaWR1LmNuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEArYQtyRkFnRTFFIMCr2kfMPZLlCCMUOOCTeLj7VBk5gG4OjQa+Mns
DVOqQgpy58hejCKUgaAl4Jm73RQFeIC/2BDi8yRoRBhL9YrVoQMF7/5/8RI/94Lv
pEsf8hREYtP3uxleeh6ZwJceHzg3mLNuzWbjDg4EOemRE38OHdVeURBif0jG20zm
9Q8yQWT2MKp4oP2CeQv6NdL5lGWfSLq58D6GoWWoszMoP1HPfVv1pw4ywApjc5ls
gBaXquMOTy+AGpX1RmXGDTgK5yeRWAngeIA7szABJfnIndynnW1rTaBGr184sOfq
L7KscKIxErbR6vZD71iGrciHfIG3hP0exwIDAQABo4IDtDCCA7AwHwYDVR0jBBgw
FoAUD4BhHIIxYdUvKOeNRji0LOHG2eIwHQYDVR0OBBYEFNWOkWTVS4/rqlwmRPa/
AjIO41XEMIH0BgNVHREEgewwgemCCGJhaWR1LmNuggliYWlkdS5jb22CDGJhaWR1
LmNvbS5jboILdy5iYWlkdS5jb22CDHd3LmJhaWR1LmNvbYIQd3d3LmJhaWR1LmNv
bS5jboIQd3d3LmJhaWR1LmNvbS5oa4IMd3d3LmJhaWR1LmhrghB3d3cuYmFpZHUu
bmV0LmF1ghB3d3cuYmFpZHUubmV0LnBoghB3d3cuYmFpZHUubmV0LnR3ghB3d3cu
YmFpZHUubmV0LnZugg53d3d3LmJhaWR1LmNvbYIRd3d3dy5iYWlkdS5jb20uY26C
DHd3dy5iYWlkdS5jbjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUH
AwEGCCsGAQUFBwMCMGsGA1UdHwRkMGIwL6AtoCuGKWh0dHA6Ly9jcmwzLmRpZ2lj
ZXJ0LmNvbS9zc2NhLXNoYTItZzYuY3JsMC+gLaArhilodHRwOi8vY3JsNC5kaWdp
Y2VydC5jb20vc3NjYS1zaGEyLWc2LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG/WwB
ATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAgG
BmeBDAECAjB8BggrBgEFBQcBAQRwMG4wJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw
LmRpZ2ljZXJ0LmNvbTBGBggrBgEFBQcwAoY6aHR0cDovL2NhY2VydHMuZGlnaWNl
cnQuY29tL0RpZ2lDZXJ0U0hBMlNlY3VyZVNlcnZlckNBLmNydDAJBgNVHRMEAjAA
MIIBAgYKKwYBBAHWeQIEAgSB8wSB8ADuAHUA7ku9t3XOYLrhQmkfq+GeZqMPfl+w
ctiDAMR7iXqo/csAAAFwhphdtAAABAMARjBEAiAk6qFarGxA9EQYUwRLa/5c+O32
PoWoiT8UHx2AnlvhpQIgWqfccctYWuyldVrEefwz7oeKmYj4DFZwA2cYqECVfokA
dQBc3EOS/uarRUSxXprUVuYQN/vV+kfcoXOUsl7m9scOygAAAXCGmF2pAAAEAwBG
MEQCIHbw6/3W4PwZoqwPGwqAnu78DBlbzlg84ngsaZ5O0Ab1AiAFae+lqnF9irvh
x9JyWUoedSqno53X+DqRp4vvD+uTDzANBgkqhkiG9w0BAQsFAAOCAQEAfHiQU/1K
AjZzbD5Eoy/gN5Gkbhtowztis1TZBlxkHsrqAxGXT47ZuHqo5JuSm/LePzKyuJXl
/E4H8kCk7a7tt2NWHFPIahU1svot1pAK9zyQItsJFqnwgQUBPwPGulgP7s/CquK2
U9KCTWHDMiT30lG5ydEKXUq520yn6Ew4V4fzFdINiO78VJzYb1og7Eb1m1wNwEWm
GrMRBOlVdoPKDLluyowGzIbwAADp/GSl5kGgNo7R4fDOT8Umv58p8qYKxu5bto++
G0h8rqce1b2jsRjBd1NaXG0azwAMncK615vGMdgrH/SAXLKewPErz5kWohIdVWzz
wKIvDsysKW1iSg==
-----END CERTIFICATE-----
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            10:e6:fc:62:b7:41:8a:d5:00:5e:45:b6
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=BE, O=GlobalSign nv-sa, CN=GlobalSign Organization Validation CA-SHA256-G2
        Validity
            Not Before: Nov 21 08:00:00 2016 GMT
            Not After : Nov 22 07:59:59 2017 GMT
        Subject: C=US, ST=California, L=San Francisco, O=Wikimedia Foundation, Inc., CN=*.wikipedia.org
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:c9:22:69:31:8a:d6:6c:ea:da:c3:7f:2c:ac:a5:
                    af:c0:02:ea:81:cb:65:b9:fd:0c:6d:46:5b:c9:1e:
                    ed:b2:ac:2a:1b:4a:ec:80:7b:e7:1a:51:e0:df:f7:
                    c7:4a:20:7b:91:4b:20:07:21:ce:cf:68:65:8c:c6:
                    9d:3b:ef:d5:c1
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Agreement
            Authority Information Access:
                CA Issuers - URI:http://secure.globalsign.com/cacert/gsorganizationvalsha2g2r1.crt
                OCSP - URI:http://ocsp2.globalsign.com/gsorganizationvalsha2g2
            X509v3 Certificate Policies:
                Policy: 1.3.6.1.4.1.4146.1.20
                  CPS: https://www.globalsign.com/repository/
                Policy: 2.23.140.1.2.2
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 CRL Distribution Points:
                Full Name:
                  URI:http://crl.globalsign.com/gs/gsorganizationvalsha2g2.crl
            X509v3 Subject Alternative Name:
                DNS:*.wikipedia.org, DNS:*.m.mediawiki.org, DNS:*.m.wikibooks.org, DNS:*.m.wikidata.org, DNS:*.m.wikimedia.org, DNS:*.m.wikimediafoundation.org, DNS:*.m.wikinews.org, DNS:*.m.wikipedia.org, DNS:*.m.wikiquote.org, DNS:*.m.wikisource.org, DNS:*.m.wikiversity.org, DNS:*.m.wikivoyage.org, DNS:*.m.wiktionary.org, DNS:*.mediawiki.org, DNS:*.planet.wikimedia.org, DNS:*.wikibooks.org, DNS:*.wikidata.org, DNS:*.wikimedia.org, DNS:*.wikimediafoundation.org, DNS:*.wikinews.org, DNS:*.wikiquote.org, DNS:*.wikisource.org, DNS:*.wikiversity.org, DNS:*.wikivoyage.org, DNS:*.wiktionary.org, DNS:*.wmfusercontent.org, DNS:*.zero.wikipedia.org, DNS:mediawiki.org, DNS:w.wiki, DNS:wikibooks.org, DNS:wikidata.org, DNS:wikimedia.org, DNS:wikimediafoundation.org, DNS:wikinews.org, DNS:wikiquote.org, DNS:wikisource.org, DNS:wikiversity.org, DNS:wikivoyage.org, DNS:wiktionary.org, DNS:wmfusercontent.org, DNS:wikipedia.org
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Subject Key Identifier:
                28:2A:26:2A:57:8B:3B:CE:B4:D6:AB:54:EF:D7:38:21:2C:49:5C:36
            X509v3 Authority Key Identifier:
                keyid:96:DE:61:F1:BD:1C:16:29:53:1C:C0:CC:7D:3B:83:00:40:E6:1A:7C
    Signature Algorithm: sha256WithRSAEncryption
        8b:c3:ed:d1:9d:39:6f:af:40:72:bd:1e:18:5e:30:54:23:35:
        ...

秘鑰: 可以是二進(jìn)制格式,可以是文本格式的一串內(nèi)容。(公鑰/私鑰)

4.4.2 編碼與格式

  • .der .cer .crt,文件是二進(jìn)制格式,只保存證書,公鑰,不保存私鑰。

  • .pem,一般是文本格式,可保存證書,公鑰,可保存私鑰。

  • .pfx .P12,二進(jìn)制格式,同時(shí)包含證書和私鑰,一般有密碼保護(hù)。

X.509 DER(Distinguished Encoding Rules)編碼,后綴為:.der .cer .crt

X.509 PEM格式(BASE64編碼),后綴為:.pem .cer .crt

PEM 文件只是 DER 編碼數(shù)據(jù)的 base64 編碼版本

4.4.3 PKCS

The Public-Key Cryptography Standards (PKCS)是由美國RSA數(shù)據(jù)安全公司及其合作伙伴制定的一組公鑰密碼學(xué)標(biāo)準(zhǔn),其中包括證書申請(qǐng)、證書更新、證書作廢表發(fā)布、擴(kuò)展證書內(nèi)容以及數(shù)字簽名、數(shù)字信封的格式等方面的一系列相關(guān)協(xié)議。

1. PKCS #1 (RSA專屬)

DER編碼公鑰

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

DER編碼私鑰

RSAPrivateKey ::= SEQUENCE {
  version          Version,
  modulus          INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent  INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1        INTEGER,  -- d mod (p-1)
  exponent2        INTEGER,  -- d mod (q-1)
  coefficient      INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos  OtherPrimeInfos OPTIONAL
}

PEM格式公鑰

-----BEGIN RSA PUBLIC KEY-----
BASE64 ENCODED DATA
-----END RSA PUBLIC KEY-----

PEM格式私鑰

-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----

2.PKCS #8 (更通用)

DER編碼公鑰

PublicKeyInfo ::= SEQUENCE {
  algorithm      AlgorithmIdentifier,
  PublicKey      BIT STRING
}
AlgorithmIdentifier ::= SEQUENCE {
  algorithm      OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

DER編碼私鑰

PrivateKeyInfo ::= SEQUENCE {
  version        Version,
  algorithm      AlgorithmIdentifier,
  PrivateKey      OCTET STRING
}
AlgorithmIdentifier ::= SEQUENCE {
  algorithm      OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

PEM格式公鑰

-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----

PEM格式私鑰

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----

4.5 密鑰交換 協(xié)議/算法 (D-H)

Diffie-Hellman算法是Whitefield Diffie和Martin Hellman在1976年公布的一種密鑰交換算法.

它是一種安全協(xié)議,而不是加密方法,所以密鑰鑰必須和其他一種加密算法(比如AES)結(jié)合使用。

這種密鑰交換技術(shù)的目的可以讓雙方在完全沒有對(duì)方任何預(yù)先信息的條件下通過不安全信道創(chuàng)建起一個(gè)密鑰。這個(gè)密鑰可以在后續(xù)的通訊中作為對(duì)稱密鑰來加密通訊內(nèi)容

4.5.1 ECDH

ECC算法和DH結(jié)合使用,用于密鑰磋商,這個(gè)密鑰交換算法稱為ECDH。

5、其他算法

DSA:Digital Signature Algorithm (DSA)數(shù)字簽名算法;

ECDSA:ECC+DSA (橢圓曲線數(shù)字簽名算法)

國密算法:即中國國家密碼局認(rèn)定的國產(chǎn)密碼算法。主要有SM1,SM2,SM3,SM4。密鑰長度和分組長度均為128位。

SM1 為對(duì)稱加密。其加密強(qiáng)度與AES相當(dāng)。該算法不公開,調(diào)用該算法時(shí),需要通過加密芯片的接口進(jìn)行調(diào)用。

SM2為非對(duì)稱加密,基于ECC。該算法已公開。由于該算法基于ECC,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強(qiáng)度比RSA 2048位高,但運(yùn)算速度快于RSA。?國家密碼管理局公布的公鑰算法,其加密強(qiáng)度為256位

SM3 消息摘要??梢杂肕D5作為對(duì)比理解。該算法已公開。校驗(yàn)結(jié)果為256位。

SM4 無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法。對(duì)稱加密,密鑰長度和分組長度均為128位。

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

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

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