文章目录
一、对称加密简介
对称密钥算法(Symmetric-key algorithm),又称为对称加密、私钥加密、共享密钥加密,是一种使用相同密钥进行加密和解密的密码学技术。其核心思想是:发送方和接收方需预先共享一个密钥,加密时用密钥将明文转换为密文,解密时用同一密钥将密文还原为明文。
典型算法:AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密算法)、SM4(国密算法)、RC4(流加密算法)、Rabbit(流加密算法)等。
特点:
-
- 对称加密算法是加密/解密可逆的算法。
-
- 其加密和解密使用相同的密钥。
-
- 对输入数据无长度要求,加密速度快。
-
- 密钥可随机生成,但有位数要求(一般定义为key)。
-
- 不同算法的密钥长度:
AES
:16、24、32字节(对应AES - 128、AES - 192、AES - 256)DES
:8字节3DES
:24字节SM4
:16字节RC4
:1 - 256字节(位数)
对称加密分类:
- 分组加密(将明文分组后逐组加密):AES、DES、3DES、SM4 。
- 序列加密/流加密(以字节流方式依次加密(解密)每个字节):RC4、Rabbit。
二、对称加密的基本过程
对称加密的核心流程可概括为以下三步:
-
密钥生成:
- 加密双方需预先共享一个相同的密钥(Key),密钥长度通常为128位(AES-128)、192位或256位,密钥的安全性直接决定加密强度。
-
加密过程:
- 发送方使用密钥和加密算法(如AES)将明文(Plaintext)转换为密文(Ciphertext)。
- 数学表达:
密文 = E(明文, 密钥)
,其中E
为加密函数。
-
解密过程:
- 接收方使用相同的密钥和对应的解密算法将密文还原为明文。
- 数学表达:
明文 = D(密文, 密钥)
,其中D
为解密函数。
示例:
- 用户A使用AES-256密钥加密邮件内容,通过互联网发送给用户B。
- 用户B使用相同的密钥解密,恢复原始邮件。
三、对称加密的运算模式
对称加密算法通常以固定大小的块(如AES的128位块)处理数据。当明文长度非块大小的整数倍时,需结合运算模式(Mode of Operation,简称:mode)实现高效加密。
最常见的加密模式(经验总结):ECB和CBC
3.1 ECB(电子密码本模式)
ECB(电子密码本模式,Electronic Codebook)是最简单的对称加密运算模式。它将明文划分为固定长度的块(如 AES 中为 128 位),每个块独立使用密钥进行加密,生成相应的密文块。
- 优点:实现简单,加密和解密速度快
- 缺点:由于相同的明文块会生成相同的密文块,容易暴露明文的数据模式,在安全性要求较高的场景下存在被破解的风险。例如,在加密图像数据时,重复的图案可能会在密文中呈现出规律,攻击者可借此进行分析。
3.2 CBC(密码分组链接模式)
CBC(密码分组链接模式,Cipher Block Chaining)克服了 ECB 模式的部分缺陷。在 CBC 模式中,每个明文块在加密前会与前一个密文块进行异或运算,然后再使用密钥进行加密。第一个明文块则与一个初始向量(IV)进行异或运算。这样,即使明文存在相同的块,由于异或运算的作用,生成的密文块也会不同,大大提高了加密的安全性。但 CBC 模式的缺点是加密过程存在顺序性,必须按顺序处理每个分组,无法进行并行处理,在一定程度上影响了加密效率。
- 初始化向量(IV):首个明文块需与随机IV异或,IV无需保密但需唯一。
- 优点:隐藏明文模式,安全性高于ECB。
3.3 CFB(密码反馈模式)
CFB(密码反馈模式,Cipher Feedback)将加密算法作为流密码的密钥流生成器。它将前一个密文块加密后生成的结果,与当前明文块进行异或运算,得到当前密文块。CFB 模式不需要填充明文,能够按字节或比特进行加密,适用于实时数据加密,如网络通信中的数据流。不过,由于其加密过程依赖于前一个密文块,一旦密文在传输过程中出现错误,会影响后续所有密文块的解密。
- 适用场景:需要部分解密或错误传播可控的场景(如实时语音加密)。
3.4 OFB(输出反馈模式)
OFB(输出反馈模式,Output Feedback)与 CFB 模式类似,也是将加密算法作为密钥流生成器。不同的是,OFB 模式使用加密算法的输出直接作为密钥流,与明文进行异或运算。OFB 模式同样不需要填充明文,对密文传输中的错误不敏感,即使部分密文出错,也不会影响后续密文块的解密,但它在安全性方面相对 CBC 模式较弱。
- 特点:错误仅影响当前块,但需严格同步。
3.5 CTR(计数器模式)
CTR(计数器模式,Counter Mode)是一种较新且高效的运算模式。它使用一个计数器,每个明文块对应一个不同的计数器值,计数器值经过加密后生成密钥流,与明文块进行异或运算得到密文块。CTR 模式支持并行处理,加密和解密速度快,并且对密文传输错误不敏感,在现代密码学应用中得到广泛使用。
- 优点:并行计算高效,支持随机访问(如磁盘加密)。
3.6 CTS(密文窃取模式)
CTS(密文窃取模式,Cipher Text Stealing)用于解决块密码加密中最后一个数据块长度不足的问题。 在加密过程中,最后一个数据块长度不足时,会使用部分密文块填充明文块,然后进行加密。 在解密过程中,最后一个数据块长度不足时,会使用部分密文块解密,然后去除填充部分。保持了加密前后数据长度的一致性。
四、填充模式
在对称加密中,由于加密算法通常要求明文的长度是固定块大小的整数倍(如 AES 的块大小为 128 位),当明文长度不满足要求时,就需要使用填充模式(Padding Schemes,简称:padding)。
- 当明文长度不足一个分组时,需填充到一个分组长度。
- 当明文长度恰好为一个分组时,需再填充一个分组长度。
4.1 PKCS#7填充
PKCS#7 填充是一种常见的填充方式。它会在明文的末尾填充一定数量的字节,每个字节的值等于填充的字节数。例如,如果明文长度为 120 位,距离 128 位的块大小还差 8 位,就填充 8 个字节的 0x08。在解密时,接收方根据最后一个字节的值,去除相应数量的填充字节,还原出原始明文。
- 填充值为填充字节数(如明文 “ABCD” → 填充 4 字节 0x04 → “ABCD\x04\x04\x04\x04”)。
- 优点:解密时可直接丢弃填充字节。
4.2 ANSIX923填充
ANSIX923 填充与 PKCS#7 类似,也是在明文末尾进行填充。不同的是,它除了最后一个字节表示填充的字节数外,其余填充字节都为 0。例如,若需要填充 8 个字节,前 7 个字节为 0,最后一个字节为 0x08。
4.3 ISO10126填充
填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。例如:明文 “ABCD” → 填充随机字节 + 0x04 → “ABCD\xA1\xB2\xC3\x04”
4.4 零填充(Zero Padding)
零填充是最简单的填充方式,直接在明文末尾填充 0,使明文长度达到块大小的整数倍。但零填充存在一定的安全隐患,因为在解密时,无法准确判断填充的 0 是原始数据中的 0 还是填充的 0,可能导致解密错误或数据泄露风险。例如:明文 “ABCD” → “ABCD\x00\x00\x00\x00”(可能混淆数据边界)
- 缺点:无法区分填充与真实数据(如二进制文件)。
4.5 无填充(No Padding)
- 要求明文长度为块大小的整数倍,否则报错。
- 适用场景:已知长度的结构化数据(如哈希值)。
五、偏移量
偏移量(Initialization Vector, IV)是对称加密中用于增强安全性的随机值,在 CBC、CFB 等模式中必需。
- 其核心作用:
-
随机化输入:即使相同明文和密钥,不同 IV 会生成不同密文,防止模式分析攻击。
-
抵御重放攻击:每次加密使用唯一 IV,避免攻击者重复发送旧密文。
- 使用规范:
- IV 无需保密,但需与密文一起传输。
- IV 必须随机生成(如通过 CSPRNG),且长度与块大小一致(如 AES-CBC 的 IV 为 128 位)。
- 与密钥的关系:
- IV≠密钥。密钥需严格保密,而IV可公开。
- 示例:
- 在 AES CBC 中,加密流程为:密文块 = 加密(当前明文块 XOR 前一块密文),首块使用 IV。