iOS安全之密码学 - GardenerYun/iOS--Note GitHub Wiki
前言
本文粗略的从字符、字符集、传输编码、算法等概念梳理了密码学基本的相关知识。特定算法的知识与使用方法,本文未做详细介绍。
1、字符集与字符编码(规则)
1.1 字符集(Charset)
字符集是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
-
ASCII
-
国标系列GB2312、GB18030等
-
BIG5
-
Unicode
1.2 字符编码(规则)(Character Encoding)
字符编码(规则)是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基础技术。
-
ASCII
-
国标系列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): 美国信息交换标准代码)
ASCII是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准。
ASCII范围 0x00 - 0x7f
扩展ASCII范围 0x80 - 0xff
Bin(二进制) | Dec(十进制) | Hex(十六进制) | 缩写/字符 | 解释 |
---|---|---|---|---|
0000 0000 | 0 | 0x00 | NUL(null) | 空字符 |
0000 0001 | 1 | 0x01 | SOH(start of headline) | 标题开始 |
0000 0010 | 2 | 0x02 | STX (start of text) | 正文开始 |
0000 0011 | 3 | 0x03 | ETX (end of text) | 正文结束 |
0000 0100 | 4 | 0x04 | EOT (end of transmission) | 传输结束 |
~~~ | ~~~ | ~~~ | ~~~ | ~~~ |
~~~ | ~~~ | ~~~ | ~~~ | ~~~ |
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 | { | 开花括号 |
0111 1100 | 124 | 0x7C | | | 垂线 |
0111 1101 | 125 | 0x7D | } | 闭花括号 |
0111 1110 | 126 | 0x7E | ~ | 波浪号 |
0111 1111 | 127 | 0x7F | DEL (delete) | 删除 |
1.4 Unicode字符集
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。容纳世界上所有语言字符和符号的集合它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 全称学名是Universal Multiple-Octet Coded Character Set,简称为UCS。
广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和UTF-8、UTF-16、UTF-32等等编码规则;
Unicode是定长的都为双字节。
Unicode编码目前规划的总空间是17个平面,0x0000 至 0x10FFFF。每个平面有 65536 个码点。理论上这个总的长度有1114112个。目前已收录14万+字符。
1990年开始研发,1994年正式发布1.0版本,2005年3月发布4.1版本,2020年发布13.0版本。
1.5 UTF-8
UTF-8是Unicode的编码规则之一,最常用编码规则。(UTF是“UCS Transformation Format”的缩写)
举个栗子:wallyt海付
查询Unicode字符集是这样的编码表:
字符 | Unicode 编码表(十六进制) | 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编码规则: |
-
单字节的字符,字节的第一位设为0,和ASCII码完全相同;'\u0000'到'\u007F'对应全部128个ACSII字符。
-
n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
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 认识Base64编码
字符到二进制,二进制到字符。
二进制到字符,字符到二进制。
计算机中很多数据是只能通过可见字符去传输
1、网站网址;
2、一些面向字符的网络协议如SMTP等;
3、图片、音视频等格式的文件传输;
4、帧定界相关等
这些情景有时由需要去传输二进制数据。基于这样的需要,诞生了Base64。
Base64是网络上最常见的用于传输 8Bit字节代码的编码方式之一,它的目的是基于64个ASCII中定义的可见字符去表示任意的二进制数据。
64个可打印的字符组成的序列如下所示:
大写字母
、小写字母
、 数字
、 +
、/
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
日常使用中我们会看到=
或者==
出现在Base64编码结果中,其=
在此是做为填充符号。
2.2 Base64编码原理
使用4个字节的文本来表示3个字节的原始二进制数据。
38 = 46 = 24
具体转换步骤
-
第一步,将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
-
第二步,将上面的24个二进制位每6个一组,共分为4组。
-
第三步,在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
-
第四部,转换成基于64个ASCII中定义的可见字符。
-
其中第二步每6位一组不够6位时,后面补0。
-
其中每6位一组完全没有数据时,使用
=
做填充复合。
二进制数据11111111 11111111 11111111
Base64编码
字符A
Base64编码
字符海
Base64编码
2.3 Base64编码特性
1)可以将任意的二进制数据进行Base64编码;
2)把3个字节变成4个字节,数据编码之后,数据量会变大,变大1/3左右;
3)每76个字符加一个换行符,最后的结束符也要处理;
4)Base64编码具有不可读性;
5)Base64正向编码后,可进行反向解码。
Base64算不上是一种“加密算法”,Base64可以成为密码学的‘基石’。
3、HASH算法
散列算法,也不是一种“加密算法”。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
特点:
-
正向快速
-
逆向困难
-
输入敏感
-
冲突避免
原理:明文通过复杂公式计算得出的结果。
目前常见且流行的 Hash 算法: MD5、SHA-1 和 SHA-2(Secure Hash Algorithm)
其中MD5、SHA-1 被“破解” 、已被证明不具备”强抗碰撞性”。 推荐至少使用SHA2-256算法
HASH算法在密码学中的应用:加签加盐,签名验证
HASH算法在管理数据结构中的应用:Java Hashmap 、Android Sparse Array 、iOS NSHashMap
4、加密算法
保密性:防止用户的标识或数据被读取。
数据完整性:防止数据被更改。
身份验证:确保数据发自特定的一方。
4.1加密与解密基本过程
整个加解密算法系统为 S = {P、C、K、E、D}
P - 明文数据(Plaintext)
C - 密文数据(Ciphertext)
K - 秘钥(Key)
E - 加密算法(Encryption algorithms)
D - 解密算法(Decryption algorithms)
P * E * Ke = C
C * D * Kd = P
针对加解密算法的选择,秘钥的传输与存储。展开讨论。
4.2对称加密
对称加密:DES、3DES、AES
4.2.1 AES 高级加密标准(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;
对于块加密,如果加密超过块大小的数据,就需要涉及填充和链加密模式。
/*!
@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且自行padding (CBC中需要初始化向量IV)
发卡钱包使用ECB
4.3 非对称加密
RSA、Elgamal、背包算法、ECC(椭圆曲线加密算法)
4.4 RSA加密算法
最常见的非对称加密算法。
4.4.1 算法基本原理
RSA原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥 。
4.4.2 数字证书与秘钥
数字证书:常用版本X.509的 v3版本规范(RFC5280),由国际电信联盟制定,内容包括证书序列号、证书有效期和公开密钥等信息。
版本号(Version Number):规范的版本号,目前为版本3,值为0x2;
序列号(Serial Number):由CA维护的为它所发的每个证书分配的一的列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能过20个字节;
签名算法(Signature Algorithm):数字签名所采用的算法,如:
· sha256-with-RSA-Encryption
· ccdsa-with-SHA2S6;
**颁发者(Issuer):**发证书单位的标识信息,如 ” C=CN,ST=Beijing, L=Beijing, O=org.example.com,CN=ca.org。example.com ”;
有效期(Validity): 证书的有效期很,包括起止时间。
主体(Subject) : 证书拥有者的标识信息(Distinguished Name),如:" C=CN,ST=Beijing, L=Beijing, CN=person.org.example.com”;
**主体的公钥信息(SubJect Public Key Info):**所保护的公钥相关的信息:
· 公钥算法 (Public Key Algorithm)公钥采用的算法;
· 主体公钥(Subject Unique Identifier):公钥的内容。
**颁发者唯一号(Issuer Unique Identifier):**代表颁发者的唯一信息,仅2、3版本支持,可选;
**主体唯一号(Subject Unique Identifier):**代表拥有证书实体的唯一信息,仅2,3版本支持,可选:
扩展(Extensions,可选): 可选的一些扩展。中可能包括:
· Subject Key Identifier:实体的秘钥标识符,区分实体的多对秘钥;
· Basic Constraints:一指明是否属于CA;
· Authority Key Identifier:证书颁发者的公钥标识符;
· CRL Distribution Points: 撤销文件的颁发地址;
· 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:
...
秘钥: 可以是二进制格式,可以是文本格式的一串内容。(公钥/私钥)
4.4.2 编码与格式
-
.der .cer .crt,文件是二进制格式,只保存证书,公钥,不保存私钥。
-
.pem,一般是文本格式,可保存证书,公钥,可保存私钥。
-
.pfx .P12,二进制格式,同时包含证书和私钥,一般有密码保护。
X.509 DER(Distinguished Encoding Rules)编码,后缀为:.der .cer .crt
X.509 PEM格式(BASE64编码),后缀为:.pem .cer .crt
PEM 文件只是 DER 编码数据的 base64 编码版本
4.4.3 PKCS
**The Public-Key Cryptography Standards (PKCS)**是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
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 密钥交换 协议/算法 (D-H)
Diffie-Hellman算法是Whitefield Diffie和Martin Hellman在1976年公布的一种密钥交换算法.
它是一种安全协议,而不是加密方法,所以密钥钥必须和其他一种加密算法(比如AES)结合使用。
这种密钥交换技术的目的可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容
4.5.1 ECDH
ECC算法和DH结合使用,用于密钥磋商,这个密钥交换算法称为ECDH。
5、其他算法
DSA:Digital Signature Algorithm (DSA)数字签名算法;
ECDSA:ECC+DSA (椭圆曲线数字签名算法)
国密算法:即中国国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。国家密码管理局公布的公钥算法,其加密强度为256位
SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。