公司密评培训 - 2023/09/09 第一课
本文是公司质量部杨总组织的密评培训第二课《密码算法》的讲义,著作权归属于杨总,博主仅为适配 post 修改格式。
XOR 异或
由于后续的分组模式都涉及到 XOR,因此简单介绍下 XOR。异或的标识符号为⊕。详细的内容不多介绍,仅需要知道如下规则即可:对同一个比特序列进行两次 XOR 之后就会回到最初的状态。
$$A⊕B=C$$
$$C⊕B=A$$
密码杂凑算法
密码杂凑算法对任意长度的消息进行压缩,输出定长的消息摘要或杂凑值。
杂凑算法具有以下特质:
- 抗原像攻击(单向性):给定杂凑值 h,找到消息 M 使得 h=H(M) 是困难的。
- 抗第二原像攻击(弱抗碰撞性):给定消息 M1,找到另外一个消息 M2 使得 H(M2)=H(M1) 是困难的。
- 强抗碰撞性:找到两个消息 M1 和 M2(M1 不同于 M2),使得 H(M2)=H(M1) 是困难的。
常见的杂凑算法结构
- M-D结构:MD5、SHA-1、SHA-2、SM3
- 海绵结构:SHA-3
密码杂凑算法的直接应用是产生消息摘要。进一步与密钥一同使用保护消息的完整性,与公钥密码算法一同使用产生数字签名。
算法 | 结构 | 输入消息长度 | 输出长度 | 分组长度 | 迭代次数 | 密码安全强度 |
---|---|---|---|---|---|---|
SM3 | M-D | <$2^{64}$ | 256 | 512 | 64 | 128 |
MD5 | M-D | 不限制 | 128 | 512 | 64 | 不安全 |
SHA-1 | M-D | <$2^{64}$ | 160 | 512 | 80 | 60 |
SHA-224 | M-D | <$2^{64}$ | 224 | 512 | 64 | 112 |
SHA-256 | M-D | <$2^{64}$ | 256 | 512 | 64 | 128 |
SHA-384 | M-D | <$2^{128}$ | 384 | 1024 | 80 | 192 |
SHA-512 | M-D | <$2^{128}$ | 512 | 1024 | 80 | 256 |
SHA3-224 | 海绵 | 不限制 | 224 | 144 | 24 | 112 |
SHA3-256 | 海绵 | 不限制 | 256 | 136 | 24 | 128 |
SHA3-384 | 海绵 | 不限制 | 384 | 104 | 24 | 192 |
SHA3-512 | 海绵 | 不限制 | 512 | 72 | 24 | 256 |
公钥密码算法
公钥密码算法很好的解决了对称密码算法中存在的密钥管理难题。公钥密码算法包括公钥加密和私钥签名两种主要用途。公钥和私钥是密切关联的,从私钥可以推导出公钥,但从公钥推导出私钥在计算上是不可行的。
公钥加密算法使用公钥对数据进行加密,使用私钥对数据进行解密。
私钥签名算法使用私钥对消息进行签名,使用公钥对签名进行验证。
常见的公钥密码体制:
- RSA、RABin:基于大整数因子分解困难性
- ElGamal:基于有限域离散对数问题困难性
- SM2、SM9、ECDH、ECDSA、ECC:椭圆曲线上的离散对数问题
- 后量子密码:基于格的密码
SM2 算法的安全性:
- 算法具备单向性
- 算法产生的明文和密文具备不可区分性
- 密文具备不可延展性
密钥长度 | 密码安全强度 | |
---|---|---|
ECC算法 | RSA算法 | |
112 | 512 | 56 |
160 | 1024 | 80 |
224 | 2048 | 112 |
256 | 3072 | 128 |
384 | 7680 | 192 |
512 | 15360 | 256 |
对称密码算法
序列密码(流密码)
将密钥和初始向量作为输入,通过密钥流生成算法输出密钥流(也称扩展密钥序列),然后将明文序列和密钥流进行异或,得到密文序列。
- ZUC
- SNOW(SNOW2.0、SNOW 3G)
- RC4
优点:密钥流可以在明文序列到来之前生成,执行速度快,计算资源的占用较少,便于硬件实施,常用于功耗或计算能力受限的系统中,没有或只有有限的错误传播。可用于实时性要求高的场景
缺点:低扩散、插入及修改的不敏感性
算法 | 密钥长度(bit) | 种子密钥(bit) | 初始向量(bit) | 密钥流(bit) |
---|---|---|---|---|
ZUC | 128 | 128 | 128 | 32 |
SNOW 3G | 128 | 128 | 128 | 32 |
ZUC 算法分为加密算法 128-EEA3 和完整性算法 128-EIA3。
SNOW 算法分为加密算法 UEA2 和完整性算法 UIA2。
ZUC 算法由线性反馈移位寄存器(LFSR)、比特重组(BR)、非线性函数 F 三个基本部分组成。
分组密码(块密码)
首先对明文消息根据分组大小进行分组,再将明文分组、密钥和初始向量(如有)一起作为输入,通过分组加密算法直接输出密文分组。
- SM4
- DES、3DES
- AES
优点:明文信息良好的扩展性,对插入的敏感性,不需要密钥同步,较强的适用性,适合作为加密标准
缺点:加密速度慢,错误扩散和传播
算法 | 分组大小(位) | 密钥大小(位) | 运算轮数 | 结构 | 密码强度 |
---|---|---|---|---|---|
SM4 | 128 | 128 | 32 | 非平衡 Feistel | 128 |
AES-128 | 128 | 128 | 10 | SPN | 128 |
AES-192 | 128 | 192 | 12 | SPN | 192 |
AES-256 | 128 | 256 | 14 | SPN | 256 |
Twofish | 128 | 128~256 | 16 | Feistel | / |
DES | 64 | 56 | 16 | Feistel | 不安全 |
3DES-2 | 64 | 112 | 48(16*3) | Feistel | 80~112 |
3DES-3 | 64 | 168 | 48(16*3) | Feistel | 112 |
Blowfish | 64 | 32-448 | 16 | Feistel | 不安全 |
IDEA | 64 | 128 | 8 | Lai–Massey | 128 |
分组密码的模式
- ECB(Electronic CodeBook mode)电子密码本模式
- CBC(Cipher Block Chaining mode)密码分组链接模式
- CFB(Cipher FeedBack mode)密文反馈模式
- OFB(Output FeedBack mode)输出反馈模式
- CTR(CounTeR mode)计数器模式
ECB(Electronic CodeBook mode)电子密码本模式
ECB 是最直接的消息加密方法,明文分组加密之后的结果将直接成为密文分组。


特性
- 对某一个分组的加密或解密可独立于其他分组进行;
- 对密文分组的重排将导致明文分组的重排;
- 不能隐蔽数据模式,即相同的明文分组会产生相同的密文分组;
- 不能抵抗对分组的重放、嵌入和删除等攻击;
- 需明确一点,ECB 模式加密调用加密操作,解密调用解密操作;
- ECB 模式加解密均可以并行操作;
- 由于分组需要填充数据,密文数据长度大于等于明文数据长度。
CBC(Cipher Block Chaining mode)密码分组链接模式
CBC 模式的密文分组像链条一样互相连接在一起,将明文分组与前一个密文分组进行 XOR 运算,然后再进行加密。加密第一个明文分组时,通过事先准备好的与分组长度相同的初始向量(IV)进行 XOR。初始向量无需保密,但需要随着消息的更换而更换,且收发双方必须选用同一个初始向量。
需明确一点,CBC 模式加密调用加密操作,解密调用解密操作。


特性
- 链接操作使得密文分组依赖于当前的和以前的明文分组,因此对密文分组的重新编排不会导致对相应明文分组的重新编排;
- 每次加密使用不同的初始向量(IV)可以避免 ECB 模式下每次对相同明文使用相同密钥加密生成相同密文的弊端;
- 加密是串行的,无法并行化;解密可以并行操作;
- 如果密文分组中某一个分组损坏,但长度不变,则解密时最多影响两个分组;如果密文分组的一些数据丢失,长度发生了变化,那么后续的所有密文分组均受影响;
- 由于分组需要填充数据,密文数据长度大于等于明文数据长度。
CFB(Cipher FeedBack mode)密文反馈模式
CFB 模式的前一个密文分组会被送回到密码算法的输入端。反馈就是指返回输入端的意思。
在 ECB 和 CBC 模式中,明文分组都是通过密码算法进行加密的,但在 CFB 模式中,明文分组和密文分组之间仅执行了 XOR 运算。
特别注意,CFB 模式的加密和解密流程中,均只调用了密码算法的加密操作。


特性
- CFB 模式的加密是串行的,解密可以并行;
- 与 CBC 模式一样,每次加密时需要生产一个不同的随机向量(IV);
- CFB 模式下的消息长度可以不是分组长度的整数倍,即在加密前不需要进行填充操作;
- CFB 模式无法抵御重放攻击;
- 由于分组不需要填充,密文数据长度等于明文数据长度。
OFB(Output FeedBack mode)输出反馈模式
OFB 模式中密码算法的输出会反馈到密码算法的输入中。
与 CFB 模式类似,明文分组和密文分组之间仅执行了 XOR 运算。
特别注意,OFB 模式的加密和解密流程中,均只调用了密码算法的加密操作。


特性
- 与 CBC 模式一样,每次加密时需要生产一个不同的随机向量(IV);
- OFB 模式与 CFB 模式的区别仅在于密码算法的输入,CFB 模式密码算法的输入是前一个密文分组,OFB 模式密码算法的输入则是密码算法的前一个输出;
- OFB 模式下的消息长度可以不是分组长度的整数倍,即在加密前不需要进行填充操作;
- OFB 模式 XOR 所需的密钥流可以事先通过密码算法生成,相比较以上的密码算法,加密和解密运算效率非常高;
- 由于分组不需要填充,密文数据长度等于明文数据长度。
CTR(CounTeR mode)计数器模式
CTR 模式是将逐次累加的计数器进行加密来生成密钥流的密码模式。
与 CFB 和 OFB 模式类似,明文分组和密文分组之间仅执行了 XOR 运算。
特别注意,CTR 模式的加密和解密流程中,均只调用了密码算法的加密操作。


特性
- 支持加密和解密并行计算,可事先生成密钥流,进行加密和解密准备;
- 错误密文中的对应比特只会影响解密后明文中的对应比特,即错误不会传播;
- 每次加密都会生成一个不同的值(nonce)作为计数器的初始值。当分组长度为 128 比特(16 字节)时,前 8 个字节为 nonce,这个值在每次加密时必须都是不同的。后 8 个字节为分组序号,逐次累加;
- CTR 模式下的消息长度可以不是分组长度的整数倍,即在加密前不需要进行填充操作;
- 在 OFB 模式中,如果对密钥流的一个分组进行加密后其结果恰巧和加密前是相同的,那么这一分组之后的密钥流就会变成同一值的不断反复。在 CTR 模式中不存在该问题;
- 由于分组不需要填充,密文数据长度等于明文数据长度。
汇总比较
- ECB(Electronic CodeBook mode)电子密码本模式
- 优点
- 简单
- 快速
- 支持并行计算(加密、解密)
- 缺点
- 明文中的重复排列会反映在密文中
- 通过删除、替换密文分组可以对明文进行操作
- 对包含某些比特错误的密文进行解密时,对应的分组会出错
- 不能抵御重放攻击
- 不推荐使用
- 优点
- CBC(Cipher Block Chaining mode)密码分组链接模式
- 优点
- 明文中的重复排列不会在密文中
- 支持并行计算(仅解密)
- 能够解密任意密文分组
- 缺点
- 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
- 加密不支持并行计算
- 优点
- CFB(Cipher FeedBack mode)密文反馈模式
- 优点
- 不需要填充
- 支持并行计算(仅解密)
- 能够解密任意密文分组
- 缺点
- 加密不支持并行计算
- 对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
- 不能抵御重放攻击
- 优点
- OFB(Output FeedBack mode)输出反馈模式
- 优点
- 不需要填充
- 可事先进行加密、解密的准备
- 加密、解密使用相同结构
- 对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错
- 缺点
- 不支持并行计算
- 主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转
- 优点
- CTR(CounTeR mode)计数器模式
- 优点
- 不需要填充
- 可事先进行加密、解密的准备
- 加密、解密使用相同结构
- 对包含某些错误比特的密文进行解密时,只有明文中相对应的比特会出错
- 支持并行计算(加密、解密)
- 缺点
- 主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转
- 优点