Skip to content

密码学基础

时间:2023年3月27日 星期一

作者:小王

一、密码学的目标


1.保密性

数据在静止传输使用三种状态下始终保持机密,由对称密码和非对称密码实现。

2.完整性

确保数据没有被人未经授权更改,由消息摘要实现。

3.身份验证

验证系统用户所声称的身份,由零知识证明实现。

4.不可否认性

保证消息确实来自发送者,由数字签名实现。

二、密码学概念


1.明文(plaintext)通过密码算法生成密文(ciphertex)。

2.密码算法依靠秘钥维持安全性,秘钥空间越大越安全(长度)。

3.显式安全,也叫科克霍夫(Kerckhoffs)原则,算法完全公开也是安全的。

4.隐式安全(security through obscurity),算法不公开才是安全的。

5.创建和执行代码和密码的科学叫密码术(cryptography),研宄的打败代码和密码的科学叫密码分析(cryptanalysis),两者结合叫密码学(cryptology)。

三、密码数学


1.布尔数学

就是二进制,1为真、0为假。

2.逻辑运算

• AND和:两个值都为真才为真。

• OR或:两个值至少一个为真才为真。

• NOT非:一个值的反值。

• XOR异或:两个值只有一个为真才为真。

3.模函数mod

除法求余。

4.单向函数

A经过运算得到B,但无法逆向从B得到A。

5.Nonce

一个随机数,典型例子为初始化向量(IV)。

6.零知识证明

书上山洞里有门的故事理解就行。

7.分隔知识

将职责分离和双人控制融合的做法称为分割知识,典型例子是密钥托管。4一个8位密码被4个人分别记住2位,即4个人同时操作才能执行登录或访问操作。M of N控制要求,N人数中的M个同事在场才能执行高安全任务。

8.代价函数

计算破解密码系统的成本,用于衡量密码系统的强度。

四、密码


1.代码和密码

代码(code)不一定提供保密性(用于单词和短语)(例如称呼、口号,具有代表性),密码(cipher)始终隐藏消息真是含义(用于字符和位)。

2.移位密码(transposition ciphers)

重新排列明文消息形成密文。

3.替换密码(substitution cipher)

用不同字符替换明文消息形成密文,例子有凯撒密码(单表替换)、Vigenere(多表替换,需要秘钥)。分析方法有频率分析(单表)和二阶式频率分析(多表)。

4.单次密本(one-time pad)

也叫Vernam密码,是强力的替换密码,需要秘钥,非常安全但也麻烦,因为保障其安全性有如下要求:

• 密码本必须随机生成

• 密码本必须物理保护

• 密码本只能使用一次

• 秘钥至少比被加密消息长

5.运动秘钥密码(running key cipher)

也称为书密码,高级版单次密本,就是把自己编的单次密本换成了生活中常用的书。

6.块密码(block cipher)

同一时间对整个消息执行加密算法,如移位密码。

7.流密码(stream cipher)

一次在消息的一个字符或位上执行加密算法,如凯撒密码、单次密本。

8.混淆(confusion)和扩散(diffusion)

替换带来混淆,移位带来扩散。

五、对称加密算法

发送者和接收者共用一个共享秘钥,同时用作加密和解密消息,具有以下弱点:

1.秘钥分发问题:如何在通信前把共享秘钥安全的分发给双方是个问题。

2.不提供不可否认性:无法确认加密消息来自哪一方。

3.缺乏可伸缩性:参与者太多时所需维护秘钥数量巨大,秘钥数=n(n-1)/2

4.秘钥生命周期短:参与者离开通信群体后,其所知秘钥均需销毁。

5.1 密码运行模式


5.1.1 电子密码本(Electronic Code Book, ECB)

每个块都使用相同秘钥加密,易被密码分析。

5.1.2 密码块链接(Cipher Block Chaining,CBC)

第一个块使用IV初始化向量(即随机值)进行XOR再加密,后面的块都使用前一密文块进行XOR运算再加密。错误传播(errors propagate)需注意,即一个块丢失或损坏,则该块即后续块都无法解密。

5.1.3 密码反馈(Cipher Feedback,CFB)

CBC流密码版,不把消息分解成块,而是使用存储缓冲区,存储缓冲区满时加密数据。

5.1.4 输出反馈(Output Feedback, OFB)

CFB升级版,不同的是第一个块先使用IV创建种子值(seed value),再使用SV进行XOR运算再加密,后面的块使用的SV是前一个SV通过DES运算得出。

5.1.5 计数器(Counter,CTR)

OFB降级版,不使用DES对SV做运算,而使用计数器对SV做运算。

5.1.6 伽罗瓦/计数器模式(Galois/Counter Mode,GCM)

采用标准CTR加密模式,并添加数据真实性控制,为接收方提供接收数据完整性的保证。这是通过向加密过程中添加身份验证标记来实现的。

5.1.7 具有密码块链接消息身份验证码的计数器模式(Counter with Cipher Block Chaining Message Authentication Code Mode,CCM)

与GCM类似,密码块链接消息认证码(CBC-MAC)算法替代标记实现身份验证。

5.2 常见对称加密算法(记名字,对/非,安不安全)


5.2.1 DES(Data Encryption Standard)

64位块密码,其中秘钥长度为56位,剩余8位包含奇偶校验信息。

注意:DES是加密标准,NSA国家安全局采纳的是128位秘钥的Lucifer算法,但对算法进行了修改,改为64位秘钥,称为数据加密算法(Data Encryption Algorithm,DEA),一般认为DES就是DEA,但二者还是有区别。

2DES不安全原因:遭遇中间相遇攻击

5.2.2 Triple DES

不安全

3DES通过增加秘钥数量的方式提高安全性,有4个版本:

• DES-EEE3:使用三个秘钥给明文加密三遍,秘钥长度168。

• DES-EDE3:使用三个秘钥,用一次解密运算替换了第二次加密运算,秘钥长度168。

• DES-EEE2:使用两个秘钥,其中一个秘钥加密了两次,秘钥长度112。

• DES-EDE2:使用两个秘钥,其中一个秘钥执行解密运算,秘钥长度112。

DES-EEE3是目前NIST认为安全的3DES的唯一变体。

5.2.3 IDEA(International Data Encryption Algorithm)

安全不够、长度来凑,秘钥长度为128位。该算法虽然是专利,但因专利到期可无限制使用,常用于PGP(Pretty Good Privacy, 良好隐私)安全邮件中。

5.2.4 Blowfish

可变长的秘钥长度32~448位,且可免费使用。

5.2.5 Twofish

秘钥长度1~256位,处理128位块,使用两种特殊技术:预白化处理(prewhitening)白化后处理(postwhitening),即加密前后使用子密钥进行XOR运算。

5.2.6 Skipjack

秘钥长度为80位,处理64位块,常用于政府机构,因为秘钥受NIST和财政部把控。

5.2.7 RC(Rivest Ciphers)

RSA中的Ron Rivest创建的一系列对称加密算法,其享有专利权。

• RC4:流密码,密钥长度40~2048位,已不再安全。

• RC5:块密码(32、64、128位),密钥长度0~2040位,已不再安全。

• RC6:块密码(128位),密钥长度128、192、256位,目前安全的算法。(RC里只有6安全

5.2.8 AES(Advanced Encryption Standard)(对称加密中最安全)

秘钥长度128、192、256位,处理128位块。AES也是一个加密标准,最终Rijndael算法被选中替代DES,参选的算法还有MARS、RC6、Serpent、Twofish。

5.2.9 CAST

CAST算法使用Feistel网络,有两种形式:

• CAST-128:块密码(64位),密钥长度40~128位。

• CAST-256:块密码(128位),密钥长度128、160、192、224或256位。

特殊性需留意

img

5.3 对称密钥管理


5.3.1 创建和分发对称秘钥

• 线下分发:物理上交换秘钥。

• 公钥加密:利用非对称加密算法传递对称秘钥。

• Diffie-Hellman:类似非对称加密算法,但仅限于共享秘钥的交换

5.3.2 存储和销毁对称秘钥

• 不将加密秘钥与加密数据存放在一个系统里。

• 采用分隔知识原则。

• 用户离开秘钥必须销毁。

密钥存储机制有基于软件和基于硬件两种机制,基于软件易实现、但易被软件自身安全性影响,基于硬件实现方法复杂、成本也更高,但提供了额外的安全性,如硬件安全模块(HSM)。

5.3.3 秘钥托管和恢复

• 公平密码系统:秘钥采用分隔知识原则分别存储在独立第三方。

• 受托加密标准:如Skipjack,为政府或其他授权代理提供了解密密文的技术手段。

5.4 密码算法生命周期

由于技术的发展,计算机算力不断提升,原来被视为安全的密码算法已不再安全,因此组织在使用密码算法时需要注意密码算法的生命周期。

六、非对称加密算法

发送者和接收者分别拥有一个公钥和一个私钥,用对方的公钥加密,用自己的私钥解密,具有以下优点:

1.秘钥分发简单:每个人的公钥所有人都可知道,私钥自己保管,可直接开始通信。

2.提供完整性、身份验证和不可否认性:私钥能够提供这些功能。

3.可伸缩性:秘钥维护简单,秘钥数=n*2

4.秘钥生命周期长:参与者提供公钥即可加入通信群体,离开也不会影响其他参与者。

缺点就是运算速度慢,而对称加密算法运算速度快。因此,现在都会使用非对称加密算法交换对称秘钥,使用对称密码算法提供后续通信安全。

6.1 RSA

由Ronald Rivest、Adi Shamir 和Leonard Adleman三人提出,利用素数因式分解题构成该算法基础,算法申请专利但已到期,可免费使用。

背包算法(Knapsack algorithm):Merkle-Hellman提出的算法,利用因式分解运算题构成该算法的基础,已证实不安全。

6.2 EI Gamal

是由T.EI Gamal提出,基于Diffie-Hellman算法的扩展,可免费使用,缺点是密文长度比明文长度大了一倍,对于传输会造成问题。

6.3 Elliptic Curve

Elliptic curve cryptography (ECC)算法利用椭圆曲线离散对数题构成该算法的基础,可使用较短秘钥长度产生高安全性,如160位ECC秘钥长度的强度与1024位RSA强度一样。

6.4 Diffie–Hellman密钥交换

Diffie–Hellman算法使用素数的数学原理,类似于RSA算法,用于秘密的交换共享密钥。通常用于创建共享密钥以用于传输层安全性(TLS),其中它被称为DHE或EDH。

6.5 量子密码(Quantum Cryptography)

量子计算(quantum computing)使用量子力学原理,用称为量子比特(qubits)的多维量子比特取代数字计算的二进制1位和0位。目前,量子计算机仅限于理论研究。量子计算机可能能够解决在当代计算机上无法解决的问题,这一概念被称为量子至上(quantum supremacy),如果实现了这一概念,可以很容易地解决许多经典非对称加密算法所依赖的因式分解问题。如果出现这种情况,可能会使RSA和Diffie–Hellman等流行算法变得不安全。因此,组织需要考虑当前加密数据的敏感周期是否超过了量子计算的应用时间,那么加密数据就会遭到泄露。

6.6 非对称密钥管理


6.6.1 加密系统的选择

算法不能有缺陷即选最佳实践,如RSA或ECC;

6.6.2 秘钥长度的选择

满足安全要求和性能的平衡;

6.6.3 保护好私钥

一旦丢失破坏了整个加密系统的安全性;

6.6.4 秘钥轮换机制

需定期更换密钥,像密码策略一样;

6.6.5 备份秘钥

秘钥一旦丢失则无法解密数据;

6.6.6 使用硬件安全模块(HSM)管理秘钥

就像硬件令牌一样。

七、哈希函数

目的是将一条任意长度的明文消息生成一个固定长度的唯一值,即消息摘要(message digest),且不可逆向(即单向函数),用于验证消息完整性。散列函数的5个基本要求:

1.输入可以是任意长度;

2.输出有一个固定长度;

3.计算相对容易;

4.单向的,无法从摘要逆向得到明文消息;

5.无冲突,不同的消息不会产生相对的消息摘要(也叫散列值)。

7.1 安全散列算法(Secure Hash Algorithm,SHA)系列


7.1.1 SHA-1

生成160位摘要消息,不安全

7.1.2 SHA-2

有4个版本,对应生成的消息摘要长度,即SHA-256、SHA-224、SHA-512、SHA-384,安全可靠

7.1.3 SHA-3

以Keccak算法为标准,可生成任意长度消息摘要,但SHA-3标准中定义了4个版本,分别是SHA3-224、SHA3-256、SHA3-384、SHA3-512。SHA-3提供了与SHA-2相同的安全级别,但它比SHA-2慢,因此除了在硬件中高效实现算法的一些特殊情况外,SHA-3不常用

7.2 消息摘要(Message Digest,MD)系列(全军覆没)


7.2.1 MD2

生成128位消息摘要,不安全;

7.2.2 MD4

生成128位消息摘要,不安全;

7.2.3 MD5

生成128位消息摘要,不安全;

7.2.4 HAVAL可变长散列

MD5的修订版,生成128、160、192、224 和256 位消息摘要,目前128位3轮计算的HAVAL已被证实不安全。

7.3 RACE原始完整性校验消息摘要(RACE Integrity Primitives Evaluation Message Digest,RIPEMD)系列


RIPEMD哈希函数是某些应用程序(如比特币加密货币实现)中使用的SHA系列的替代品。

7.3.1 RIPEMD

生成128位消息摘要,因结构缺陷,不安全;

7.3.2 RIPEMD-128

同样生成128位消息摘要,不安全;

7.3.3 RIPEMD-160

最常用的RIPEMD变体,产生一个160位消息摘要,安全可靠

RIPEMD-256是基于RIPEMD-128、RIPEMD-320是基于RIPEMD-160的改进版,但不增加安全性,仅提高了消息摘要的长度。

八、数字签名

目的是身份验证零知识证明)、不可否认性由非对称加密算法文件提供)和完整性由哈希函数提供),过程是明文消息通过散列函数计算得到消息摘要(或散列值),消息摘要通过私钥加密得到数字签名

消息摘要+私钥=数字签名

8.1 哈希消息身份认证码(HMAC)

8.1.1 消息身份验证代码(MAC)

由于传递含消息摘要的信息过程中可以被攻击者截获,篡改明文消息再计算消息摘要进而无法确保完整性,因此需要消息身份验证代码(MAC)。

8.1.2 哈希消息身份认证码(HMAC)

MAC有两种计算方式

• 先计算消息摘要,再使用共享密钥进行加密。

• 计算消息摘要时将共享密钥和数据同时输入,这种方法叫做哈希消息身份验证码(HMAC)。

HMAC算法实现了部分数字签名特性,它保证了消息在传输过程中的完整性,但不提供不可否认性。

不记也行

8.2 数字签名标准

1.DSA数字签名算法

2.RSA算法

3.椭圆曲线DSA(ECDSA)

九、公钥基础设施(PKI)

9.1 证书

可简单理解为公钥

数字证书(Digital certificates)就是个人公钥经由可信发证机构(CA)签注的副本,即经过第三方验证是合法的。不经过CA签注的数字证书也不能说是不合法,但一般仅用于内网使用。数字证书标准是X.509,包含如下内容:

证书符合X.509版本

• 序列号

• 签名算法标志符

• 颁发者名称

• 有效期

• 主体名称

• 主体公钥

• 自定义变量

9.2 证书颁发机构

这仅关乎一个信任问题,你只要信任某机构就可以让其发证,但普遍都信任规模大的公司(如赛门铁克等)。

注册机构(Registration authorities,RA)分担证书颁发机构(Certificate authorities,CA)签发证书前验证用户身份的职责,即用户申请证书需先经过RA验证,再到CA进行签发。

组织也可以选择成为内部CA,提供自签名证书(self-signed certificates)供组织内部使用,从而节省证书费用。

9.3 证书生命周期

9.3.1 注册

用户(公司)申请数字证书,需先向CA证明其身份信息。然后组织通过证书签名请求(certificate signing request,CSR)的形式向CA提供自己的公钥。CA基于组织身份信息和公钥创建数字证书,然后使用CA的私钥对数字证书进行数字签名,然后该数字签名就可以正常使用。数字证书根据组织身份信息验证的级别,分为以下几种类型:

• 域名验证(DV):需验证域名的控制权。

• 组织验证(OV):需验证组织的资质信息。

• 扩展验证(EV):最严格的组织信息验证。

9.3.2 验证

当收到一个用户的数字证书时(也就是该用户的、经过验证的公钥),使用CA的公钥检查该证书的数字签名,用以确定该用户数字证书的合法性。除了验证CA的数字签名外,还需要查看证书注销列表(CRL)在线证书状态协议(OCSP)检查证书有效性。

9.3.3 注销

当证书失信、证书误发、证书内容变更、安全关系变更时,需要对证书进行注销。有三种技术来验证证书的真实性并识别已吊销的证书:

• 证书注销列表(CRL):CA提供的证书列表,用户可下载验证。

• 在线证书状态协议(OCSP):用户可向OCSP服务器发送验证请求进行验证。

• 证书装订(Certificate Stapling):OCSP的扩展技术,如果每个用户都对证书进行验证,OCSP服务器的压力非常大,因此网站可进行验证,将OCSP响应绑定证书发送给用户,进而降低OCSP服务器压力。

9.4 证书格式

看到后缀知道是证书即可

1.DER:二进制格式,常见后缀为der、crt、cer。

2.PEM:DER格式的ASCII文本版本,常见后缀为pem、crt。

3.PFX:Windows系统通常使用,二进制格式,常见后缀为pfx、p12。

4.P7B:Windows系统通常使用,ASCII文本格式,常见后缀为p7b。

9.5 混合密码学

由于对称加密算法和非对称加密算法各有优劣势,因此在使用过程中会混合使用,即混合密码学(Hybrid Cryptography)。

img

通信前:

1.服务器生成公钥发送给CA

2.CA用自己的私钥做签名生成CA证书

3.CA将CA证书给服务器

4.浏览器内置CA的公钥

通信开始:

1.客户端发起链接

2.服务器将CA证书返回给客户端

3.客户端通过内置CA公钥验证CA证书合法性

4.生成随机对称秘钥

5.将客户端生成的对称秘钥通过公钥加密发送给服务器

6.通过随机秘钥进行http通信