文章目录
简述
阅读完本作后, 惊艳于作者的出色的文笔,生动形象的举例,清晰明了的图例 让我这类的初学者系统性的了解 密码技术, 密码技术的互相关系, 密码的常识, 以及对应的使用落地场景, 使之受益匪浅!!! 个人深知我的记忆是有限存储,故写下本篇文章用于归纳记忆该作品内容;
该文章是对于本书的理解进行归纳填充, 该体系对于我来讲更便于记忆,如有错误和指导不胜感激;
图解密码学
相关密码词汇和缩写介绍
针对本文&本书常见的词汇的补充, 力争可以在日常交谈中关于名词不会出现蒙蔽的情况
单词 | 音标 (美式) | 意思 | 备注 |
---|---|---|---|
cryptography | [krɪpˈtɑːɡrəfi] | 密码学 | |
encrypt | [ɪnˈkrɪpt] | 加密 | 跟 decrypt 解密 配套 |
decrypt | [diːˈkrɪpt] | 解密 | |
plaintext | [ˈpleɪn tekst] | 明文 | |
ciphertext | [ˈsaɪfər tekst] | 密文 | |
confidentiality | [ˌkɑːnfɪˌdenʃiˈæləti] | 机密性 | 运用密码技术保证消息&私钥的机密性 |
cryptanalysis | [ˌkrɪptəˈnæləsɪs] | 密码破译;密码分析 | 接收者以外的其他人试图将密文还原为明文,则称为密码破译 |
cryptanalyst | [krip’tænəlist] | 破译者 | 进行破译的人称为破译者, 破译者并不一定是坏人; |
algorithm | [ˈælɡərɪðəm] | 算法 | 用于解决复杂问题的步骤,通常称为算法, 从明文 → 密文的加密步骤称为 ”加密算法“, 则对应解密操作称为 ”解密算犯法“, 将二者合在一起,统称 ”密码算法“ |
authentication | [ɔːˌθentɪˈkeɪʃn] | 认证 | |
digital | [ˈdɪdʒɪtl] | 数字 | digital signature 即为 数字签名 |
signature | [ˈsɪɡnətʃər] | 签名 | autograph 也称签名, 但并不适用,从语义上 signature 带有 ”签署“ 之意的签名的意思 |
initialization | [ɪˌnɪʃələˈzeɪʃn] | 初始化 | |
verify | [ˈverɪfaɪ] | 验证 | |
malicious | [məˈlɪʃəs] | 恶意的 | 在日常通信过程中存在多种角色, 其中主公攻击者(介入发送者和接收者之间通信过程,进行阻碍通信或篡改密文的活动), 一般称为 Mallory |
salt | [sɔːlt] | 盐 | 通过伪随机数生成器产生的随机值 |
randomness | [ˈrændəmnəs] | 随机性; | |
unpredictability | [ˌʌnprɪˌdɪktəˈbɪləti] | 不可预测性 | un(否定) - pre (之前) - dict(说) - ability (可能性) |
revocation | [ˌrevəˈkeɪʃn] | 取消;撤回;废弃 | |
certification | [ˌsɜːrtɪfɪˈkeɪʃn] | 证明, 资质证书 | Certification Pracice statement 认证业务准则 |
practice | [ˈpræktɪs] | 实践;练习 | |
statement | [ˈsteɪtmənt] | 报告 | |
collision | [kəˈlɪʒn] | 碰撞 | |
sponge | [spʌndʒ] | 海绵 | |
construction | [kənˈstrʌkʃn] | 建造,建筑;创立,构建;构造,结构 | |
capacity | [kəˈpæsəti] | 能力,才能;容积,容纳能力 |
缩写 | 全称 | 意思 | 备注 |
---|---|---|---|
MAC | Message Authentication Code | 消息认证码 | 消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。这个绝非 MAC地址, 更不是指 MAC 电脑; |
MD | Message Digest | 消息摘要 | 通常组合表达 MD4, MD5; 当前 MD4, MD5 均不适用于加密处理, 建议适用 SHA-256, SHA-384,SHA-512 |
SHA-3 | Secure Hash Algorithm-3 | 单向散列函数算法 | 12年确定将 Keccak 算法作为 SHA.3 的标准 |
NIST | National Institute of Standards and Techology | 美国国家标准技术研究所 | DES, AES, SHA-3 都是由该标准化机构进行推出 |
SWIFT | Society for Worldwide Interbank Financial Telecommunication | 环球银行金融电信协会 | 1973年成立,为国际银行的交易报价护航, 08年发展到208个成员国,银行与银行之前是通过 SWIFT 来传递交易消息, 而保证消息的完整性以及对消息进行验证, SWIFT 中适用了消息认证码 |
RNG | Random Number Generator | 随机数生成器 | 硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息来生产的才可以称为 ”随机数生成器“ |
PRNG | Pseudo Random Number Generator | 伪随机数生成器 | 依靠软件生成的随机数 |
DES | Data Encryption Standard | 1977年美国联邦信息处理标准(FIPS )中所釆用的一种 对称密码(FIPS 46-3 ) | |
AES | Advanced Encryption Standard | 对称密码算法 | 2000年最终选择 Rijndael 的堆成密码算法 |
Rijndael | 由比利时密码学家Joan Daemen和Vincent Rijmen设计的分组密码算法,于 2000年被选为新一代的标准密码算法——AES | ||
ECB | Electronic Code Book mode | 电子密码本模式 | 分组密码的主要模式之一, 不建议使用 |
CBC | Cipher Block Chaining mode | 密码分组链接模式 | 分组密码的主要模式之一 |
CFB | Cipher FeedBack mode | 密码反馈模式 | |
OFB | Output FeedBack mode | 输出反馈模式 | |
CTR | CounTeR mode | 计数器模式 | |
IV | Initialization Vector | 初始化向量 | 在 CBC 模式下因为需要跟前一个密文进行 XOR 处理,首次的时候不存在因此需要生成该值,切记该值为随机值 |
CRL | Certificate Revocation List | 证书作废清单 | |
CPS | Certification Practice Statement | 认证业务准则 |
密码技术介绍
RSA 非对称加密介绍
非对称加密(公钥加密)技术可以人为是最伟大的发明, 利用优雅的数学公式就可以实现让人头疼的密钥配送问题, 牛逼!
什么是非对称加密(公钥密码)?
公钥密码 (public-key cryptography) 中,密钥分为加密密钥和解密密钥, 发送者用加密密钥对消息进行加密,接收者用解密密钥进行解密。通过上述行为我们可以发现:
- 发送者只需要加密密钥
- 接收者只需要解密密钥
- 解密密钥不可以被窃听者获取
- 加密密钥被窃听者获取也没有问题
而解密密钥从一开始就是由接收者自己报关的, 只是把加密的密钥发送给发送者,故完美解决了密钥配送问题。
其中公钥和私钥是一一对应的, 一对公钥和私钥称为 密钥对 (key pair), 由公钥进行加密密文必须使用该公钥配对的私钥才能进行解密, 而确保实现上述功能是依赖于二者具备非常密切的关系 (数学上的关系), 因此公钥和密钥不能单独生成;
RAS 加解密算法公式
RSA 加密 (公钥是 {E、N})
密
文
=
明
文
E
m
o
d
N
密文 = 明文^E mod N
密文=明文EmodN
RSA 解密
明
文
=
密
文
D
M
o
d
N
明文 = 密文^D Mod N
明文=密文DModN
AES 下的模式介绍 (分组密码 || 对称密码模式介绍)
AES 属于分组密码, 常规的密码算法分为:分组密码和流密码两种;
分组密码 (block cipher)每次只能加密固定长度的一块数据的一类密码算法,如需要加密任意长度的明文则就需要对分组密码进行分组迭代,其中 一块 称为分组(block) , 一个分组的比特数称为 分组长度(block length) 1 , 而分组密码的迭代方法就称为分组密码的 ”模式” 。
详解模式分类
- ECB模式: Electronic Code Book mode (电子密码本模式)
- CBC模式: Cipher Block Chaining mode (密码分组链接模式)
- CFB模式: Cipher FeedBack mode (密码反馈模式)
- OFB模式: Output FeedBack mode (输出反馈模式)
- CTR模式: CounTeR mode (计数器模式)
分组密码模式比较表
ECB 模式
将明文分组加密后的结果直接变成密码分组(图4-2)
从上图可以看出明文的分组都是各自独立进行加密和解密, 攻击者(Mallory) 如果可以改变密文的分组顺序,即可 无需破解密码就能操控明文 。
CBC 模式
首先将明文分组与前一个密文分组进行 XOR 运算, 然后在进行加密(图4-3)
与 ECB 的区别是 CBC 在加密明文前进行了一次 XOR, 这个时候要注意加密第一个明文的分组的时候因为不存在 “前一个密文分组”, 因此需要事先准备一个长度为一个分组的比特序列来代替 “前一个密文分组”,这个比特序列称为 初始化向量 (Initialization Vector), 一般来说,每次加密的都会随机产生一个不同的比特序列作为初始化向量;
CFB模式(流密码2)
前一个密文分组会被送回到密码算法的输入端, 所为反馈,这里是指返回输入端的意思(图4-9)。
因为明文→密文是用 XOR 处理的, 因而可能遭受重放攻击(relplay attack),即截取用户信息,伪造尾部信息(2,3,4), 就可以实现3,4信息成功篡改, 2信息无法识别, 需要防止该问题需要引入 消息认证码确保是 2 无法识别是因为通信错误还是人为供给导致的;
CFB 模式与流密码
CFB模式是通过 明文分组 与 密码算法的输出 进行 XOR 运算来生成 密文分组的,这里的 密码算法输出相当于 1次性密码本的随机比特序列 , 该序列称为 密钥流(key stream) 。在 CFB 模式中, 密码算法就相当于生成密钥流的伪随机数生成器, 而初始化向量就相当于伪随机数生成器的 “种子”。
故在 CFB 模式中,明文的数据可以被逐比特加密,因此我们可以将 CFB 模式看作是一种 使用分组密码来实现流密码 的的方式。
OFB 模式
密码算法的输出会反馈到免密算法的输入中, OFB模式并不是通过密码算法对明文直接进行加密的,而是通过 “明文分组” 和 “密码算法的输出” 进行 XOR 来产生 “密码分组” ,这点 OFB 与 CFB 模式相似。
CFB 模式与 OFB 模式的对比
OFB 模式和 CFB模式的区别仅仅在密码算法输入。
CFB 模式密码算法的输入是前一个密文分组,也就是将密文分组反馈到密码算法中,故称为 “密码反馈模式”。
OFB 模式中,密码算法的输入则是密码算法的前一个输出,也就是将输出的反馈给密码算法, 故称为 “输出反馈模式”;
CTR 模式
一种通过逐次累加的计数器进行加密来生成的密钥流的流密码。
CTR 模式中, 每个分组对应一个逐次累加的计数器,并通过对计数器进行极爱来生成密钥流。也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行 XOR 而得到的。
密码的安全常识
- 不要使用保密的密码算法
- 使用低强度的密码比不进行任何加密更危险
- 任何密码总有一天会被破解
- 密码只是信息安全的一部分
单向散列函数 (one-way hash function)
它又称为 消息摘要函数(message digest function)、哈希函数 或则杂凑函数。
它有一个输入和输出, 其中输入的称为 消息 又称 原像(pre-image), 输出称为 散列值 又称 消息摘要(message digest) 或者 指纹(fingerprint) , 是可以确保消息的完整性的一种算法;
单向散列函数的性质
- 根据任意长度的消息计算出固定长度的散列值, 常见的 MD5、SHA-256
- 能快速计算出散列值
- 消息不同散列值不同, 即消息中哪怕只有 1 比特的改变, 也必须有很高概率产生不同的散列值,若两个不同的消息产生同一个散列值的情况称为 碰撞(collision), 难以发现的碰撞的性质称为 抗碰撞性 (collision resistance), 故 单向散列函数 都要具备该特性3。
- 具备单向性, 即无法通过散列值反算消息的性质。(举例:将玻璃砸碎很容易, 却无法将碎片还原成完整的玻璃)
单向散列函数的实际应用
- 检测软件是否被篡改
- 基于口令加密 (Password Based Encryption, PBE) 将口令和盐(salt, 通过伪随机生成器产生随机值)混合后计算其散列值,然后将这个散列值用作加密的密钥。
- 消息认证码,可以检测并防止通信过程中的错误、篡改以及伪装。
- 数字签名, 因为往往数字签名的处理耗时非常长, 往往需要通过单项散列函数计算出消息的散列值,然后针对散列值施加数字签名。
- 伪随机数生成器,密码技术中所使用的随机数需要具备 "事实上不可能根据过去的随机数列来预测未来的随机数数列"的性质, 需要具备不可预测性, 故可以使用单向散列函数的单向性。
- 一次性口令, 经常被用于服务器对客户端的合法性认证。
SHA-3 Keccak 介绍
Keccak(读作 ket-chak) 是一种被选定 SHA-3 标准的单项散列函数算法。
Keccak 可以生成任意长度的散列值, 但是为了兼容 SHA-2 的散列长度, SHA-3 标准中共规定 SHA3-224、SHA-3-256、SHA-3-384、SHA-3-512 四个版本。 在输入长度上限方面, SHA-2为 2 128 - 1。
海绵结构 (sponge construction)
Keccak 的海绵结构, 输入的数据进行填充之后, 要经过 吸收阶段(absorbing phase) 和 挤出阶段(squeezing phase) , 最终生成输出的散列值。
吸收阶段的流程如下
- 将经过填充的输入消息按照每 r 个比特为一个分组分割成若干个输入分组
- 首先,将 “内部状态的 r 个比特” 与 “输入分组 1” 进行 XOR, 将其结果作为 "函数 f 的输入值 "
- 然后,将 “函数 f 的输出值 r 个比特” 与 “输入分组 2” 进行 XOR, 将其结果再次作为 “函数 f 的输入值”
- 反复执行上述步骤,直到到达最后一个输入分组
- 待所有输入分组处理完成后,结束吸收阶段,进入挤出阶段
函数 f 的作用是将输入的数据进行复杂的搅拌操作并输出结果 (输入和输出的的长度均为 b = r + c 个比特), 其操作对象是长度 b = r + c个比特的内部状态, 内部状态的初始值为 0. 也就是说,通过反复将输入分组的内容搅拌进来, 整个消息就会被一点一点 “吸收” 到海绵结构的内部状态中, 就好像水分被一点一点的海绵内部一样。 每次被吸收的输入分组长度为 r 个比特, 因此 r 被称为 比特率 (bit rate).
从 图7-10 我们可以看出, 函数 f 的输入长度不是 r 个比特, 而是 r + c 个比特, 请大家注意这点, 这意味内部状态中有 c 个比特是不受输入分组内容的直接影响的(但会通过函数 f 收到间接影响)。 这里的 c 被称为容量 (capacity)
吸收阶段结束后,便进入 挤出阶段, 流程如下
- 首先, 将 “函数 f 的输出值中的 r 个比特” 保存为 “输出分组 1”, 并将整个输出值 (r + c 个比特) 在输入到函数 f 中
- 然后, 将 “函数 f 的输出值中的 r 个比特” 保存为 “输出分组 2”, 并将整个输出值 (r + c个比特) 在输入到函数 f 中
- 反复执行上述步骤, 直到获得所需长度的输出数据
无论是吸收阶段还是基础阶段,函数 f 的逻辑本身是完全相同的,每执行一次函数 f , 海绵结构的内部状态都会被搅拌一次.
挤出阶段中实际上执行的是 "对内部状态进行搅拌并产生输出分组(r个比特)"的操作, 也就是以比特率( r 个比特)为单位, 将海绵结构的内部状态中的数据一点一点地 “挤” 出来,就像从海绵里面把水分挤出来一样.
在挤出阶段中,内部状态 r + c 个比特中的容量 (c 个比特)部分是不会直接进入输出分组的, 这部分数据只会通过函数 f 间接影响输出的内容. 因此, 容量 c 的意义在防止将输入消息中的一些特征泄露出去.
Keccak 内部状态
Keccak 的内部状态是一个三位的比特数组, 如图7-12所示, 图中每个小方块代表1个比特, b 个小方块按照 55z的方式组合起来,就成为一个沿 z 轴延申的立方体.
我们将 x, y, z 三个维度的内部状态整体称为 state, state 共有 b个 比特.
如果我们只是关注内部状态的两个维度, 可以将 xz 平面称为 plane, 将 xy 平面称为 slice, 将 yz 平面称为 sheet (图7-13)
同样, 如果我们只关注其中一个维度, 可以将 x 轴称为 row, 将 y 轴沉稳给 column, 将 z 轴 称为 lane.
因此, 我们可以将 state 堪称是由 5 * 5 条 lane 构成的, 也可以看成 由于 lane 的长度相同数量的 slice 堆叠而成的.
Keccak 的本质就是实现一个能够将上述结构的 state 进行有效搅拌的函数 f, 这与分组密码设计中的搅拌过程非常相似。此外, 由于内部状态可以代表整个处理过程中的全部中间状态, 因此有利于节省内存。 Keccak 用到了很多比特单位的运算, 因此被认为可以有效抵御针对字节单位的攻击。
函数 Keccak-f [b]
Keccak 的函数 f 实际上应该叫做 Keccak-f [b] , 从这个名称可以看出, 这个函数带有一个参数 b, 即内部状态的比特长度, 这里的参数 b 称为宽度(width)。
根据 Keccak 的设计规格, 宽度 b 可以取 25、50、100、200、400、800、1600 七种值, SHA-3采用的是其中最大宽度, 即 b = 1600。 宽度 b 的7种取值的排列看起来比较怪,其实是25的整数倍, 即 25的20 ~ 26倍, 根据图7-13 可知,一片 slice 的大小为 5* 5 = 25比特,因此 b / 25 就相当于 slice 的片数(即 lane 的长度)。SHA-3的内部状态大小为 b = 5* 5* 64 = 1600个比特 。
由此可见, 在 Keccak 中,通过改变宽度 b 就可以改变内部状态的比特长度。 但无论如何改变, slice 的大小依然是 5 * 5, 改变的只是 lane 的长度而已,因此 Keccak 的宽度的变化并不会影响其基本结构。 Keccak 的这种结构称为 套娃结构,这个名字取自著名的俄罗斯套娃, 每个哇哇的形状都是相同的,只是大小不同而已。 利用该套娃结构,我们可以很容易地制作一个缩水版 Keccak 模型并尝试对其摩羯,以便于对该算法的强度进行研究。
Keccak-f[b] 中的每一轮包含5个步骤:θ(西塔)、ρ (柔)、π(派)、χ(凯)、ι(伊欧塔), 总共循环 12 + 2ℓ 轮4。具体到 SHA-3 中所使用的 Keccak-f [1600] 函数,其循环轮数为 24 轮5。
-
步骤 θ
图7-14 所示对其中 1 个比特应用步骤 θ 时情形, 这一步的操作是将位置不同的两个 column中各自 5个比特通过 XOR 运算加起来(图中 ∑ 标记),然后在和置换目标比特求 XOR 并覆盖目标比特。
-
步骤 ρ
这一步是操作沿 z 轴(lane 方向)进行比特平移。
-
步骤 π
对其中 1片 slice 应用步骤 π \pi π 的情形, 实际上整条 lane 上所有的 slice 都会被执行同样的比特移动操作。
-
步骤 χ \chi χ
下图所示 对其中 1个 row 应用步骤 χ \chi χ 的情形。 这里我们使用了一些逻辑电路的符号,其中 ▽ 代表对输入比特取反, 即 NOT, ”半椭圆“(找不到符号),代表仅当两个输入比特均为 1 时则输出 1, 即 AND。
-
步骤 ι
是用一个固定轮常数对整个 state 的所有比特进行 XOR 运算, 目的是让内部状态具备非对称性。
根据《散列函数 SHA-224、SHA-521/224、SHA-512/256 和 SHA-3(Keccak)的实现评估》,除了步骤 θ 中奇偶性(∑标记)以及步骤 χ \chi χ 中 NOT 和 AND 以外, 其余的操作仅通过硬件电路就可以实现,说明在硬件上的适应性会很好,具备通用特性。
目前应该使用哪些单向散列函数呢
算法名称 | 是否建议使用 | 说明 |
---|---|---|
MD5 | 不建议 | MD5 是不安全的,MD5的强抗碰撞性已被攻破, 04年王小云团队就已提出针对 MD5、SHA-() 等散列函数的碰撞攻击算法 |
SHA-1 | 不建议 | 2005年针对 SHA-1 的碰撞攻击算法及范例由山东大学王小云教授团队提出 |
SHA-256、SHA-284、 SHA512(统称 SHA-2) | 建议 | 不过因为它的消息长度存在上限,如今 SHA-1 强碰撞性被攻破,也就是说采用MD结构的后续可能存在风险,只是它的值很大风险较低 |
SHA-3 | 建议 |
ps: 我们不应该使用任何自制算法。
密码技术的互相关系
密码的相关技术往往都是解决特定问题的, 而现实世界中遇到的问题是多维度, 因此更多的时候是需要进行组合使用,才能有效的保护信息的安全, 以下是当前书籍上的相关密码简介。
-
对称密码
是一种用相同密钥来进行加密和解密的技术,可以确保消息的机密性,但要解决密钥配送问题,中间人攻击伪装风险。 -
非对称密码
是一种用不同密码来进行加密和解密的技术, 在确保消息机密性的基础上,解决了密码配送问题泄露问题,但因此带来的问题则是 公钥机密的速度很慢,同时也是存在中间人攻击伪装风险。 -
单向散列函数
是一种将长消息转换为短散列值的技术,用于确保消息的完整性。它还可以作为消息认证码、数字签名以及伪随机数生成器等技术的组成元素来使用。 -
消息认证码
是一种能够识别通信对象发送的消息是否被篡改的认证技术,用于验证消息的完整性,以及消息认证。 消息认证码算法中,最常用的是单向散列函数的 HMAC,它的构成不依赖某一种具体的单向散列函数算法。消息认证码对通信对象进行认证,但是无法对第三方进行认证,此外,它也无法防止否认,消息认证码也可以用于实现认证加密 -
数字签名
是一种能够对第三方进行消息认证,可以防止通信对象做出否认的认证技术。 数字签名的算法包括 RSA 、EIGamal、 DSA、 椭圆曲线DSA、 爱德华兹曲线DSA 等。公钥基础设置(PKI)使用的证书就是对公钥加上认证机构的数字签名所构成的,要验证公钥的数字签名,需要通过某种途径获取认证机构的自身的合法公钥。 -
伪随机数生成器
是一种能够生成具备不可预测性的比特序列的技术,由密码和单向散列函数等技术构成,伪随机数生成器用于生成密钥,初始化向量和 nonce 等。
各种密码技术的对比
AES 的分组长度为 128比特, 因此 AES 一次可加密128比特的明文,并声称128比特的密文; ↩︎
CFB、OFB、CTR 均可将 分组密码当流密码使用。 流密码是不需要将明文填充到长度是分组长度的整数倍,且可实时操作。所以,待发送的字符流任何一个字符都可以用面向字符的流密码加密后立即发送。流密码的特质:密文与明文等长。 ↩︎
抗碰撞性需要具备 弱抗碰撞性、强抗碰撞性 这两种特性,其中当定某条消息的散列值, 单向散列函数必须确保要找到和该条消息具备相同散列值的另外一条消息是非常困难的, 这一性质称为弱抗碰撞性; 而 强抗碰撞性 是指 要找到散列值相同的两条不同的消息是非常困难的, 在这里散列值可以是任意值; ↩︎
Keccak 设计规格中规定: 2 ℓ = b 25 \ 2^{ℓ}=\frac{b}{25} 2ℓ=25b ↩︎
∵ b = 12 + 2 ℓ , 2 ℓ = b 25 , b = 1600 ∴ ℓ = 1600 ÷ 25 2 , ℓ = 6 ∴ b = 24 \ ∵ b=12+2ℓ, 2^{ℓ}=\frac{b}{25},b=1600 ∴ℓ=\sqrt[2]{1600 \div 25}, ℓ=6 ∴b=24 ∵b=12+2ℓ,2ℓ=25b,b=1600∴ℓ=21600÷25,ℓ=6∴b=24 ↩︎