From 126eca9dc501149fd3f2a7feb3ff56f820ed171a Mon Sep 17 00:00:00 2001 From: liuzhuan Date: Thu, 7 Nov 2024 18:59:08 +0800 Subject: [PATCH] feat: update crypto 101 --- _posts/2024-11-01-on-crypto-101.md | 35 +++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/_posts/2024-11-01-on-crypto-101.md b/_posts/2024-11-01-on-crypto-101.md index 32f43d9..6b75eb4 100644 --- a/_posts/2024-11-01-on-crypto-101.md +++ b/_posts/2024-11-01-on-crypto-101.md @@ -105,16 +105,49 @@ $$ C = E_{DES}(k_1, D_{DES}(k_2, E_{DES}(k_3, p))) $$ 流加密的实现有两种方式,一种是基于已有的分块加密,另一种是从头设计的流加密算法。 +### ECB mode + 一个简单的实现方法,是把输入流切成多个固定长度的块,然后对每个块进行[分块加密](#block-cipher)。这种实现模式叫做**电子密码本模式**(*Electronic Code Book Mode*,简称 ECB 模式)。 ECB 模式有一个关键弱点,它会保留明文中的模式。如果明文中有重复的块,会生成对应的重复的密文块,攻击者有可能从密文中猜测出明文大致内容。 ECB 模式虽然简单且易于实现,但是因为有严重的安全问题,通常不推荐在实际应用中使用。 +### CBC mode + 除了 ECB 模式,还有其他的**操作模式**(*mode of operations*),可以将块加密配置为流加密。 **密码块链模式**(*cipher block chaining*,简称 CBC mode)是一种常见的配置,明文块与上一个密文块进行异或运算,然后在进行分块加密。 第一个明文块与谁搭档?手动创建一个随机数 IV(*initialization vectors*,初始化向量)。IV 应当是不可预测的,最好是密码学上的加密。 -iv 无需保密,可以伴随密文一同发送。但要保证它的不可预测性和唯一性。 \ No newline at end of file +iv 无需保密,可以伴随密文一同发送。但要保证它的不可预测性和唯一性。 + +如果 iv 使用不当,会造成安全漏洞。比如在 TLS 1.0 中,CBC 模式使用了隐式的 iv,即 iv 来自上一个密文的最后一个块,这种做法导致 iv 具有可预测性,容易遭受 BEAST 攻击,被攻击者利用以恢复部分明文。 + +为了解决这些问题,TLS 1.1 引入了显式的 iv,从而增强安全性。 + +### 填充 {#padding} + +如果明文的比特长度不是分块的整数倍时,最后一个块将不满足分块加密的长度要求。 + +常见的填充方式有以下几种: + +1. 用零填充(或者其他固定的字节常量),缺点是如果原本明文同样以零结尾,就无法区分填充字节的长度和原本明文的长度。 +2. PKCS#5/PKCS#7 填充,使用需要填充的字节数当做填充内容。比如,一个分块长度为 8 个字节,目前明文仅有 12 34 56,还差 5 个字节,那么填充后的明文块是 12 34 56 05 05 05 05 05。 + +### 原生的流加密算法 {#native-stream-cipher} + +最常用的流加密算法类型是**同步流加密**(*synchronous stream cipher*)。它的基本操作是,基于对称密钥生成一串长长的伪随机比特流。这个比特流叫做**密钥流**(*keystream*),和明文异或,输出密文。解密过程和加密过程完全一样。 + +RC4 是著名的原生流加密算法。RC4 的全称是 *Rivest Cipher 4*,由 *Ron Rivest* 于 1987 年设计。 + +RC4 最初是 RSA Security 网络安全公司的商业机密,1994 年其源代码被匿名发布到互联网,由于它运行速度快且易于实现,迅速获得广泛流行。但 RSA 始终没有承认 RC4 算法的真实性。因此,RC4 也常被称作 ARCFOUR 或 ARC4,即 *alleged RC4*(所谓的 RC4)。 + +RC4 由于安全问题,已不建议在新应用中使用。 + +Salsa20 是一种更新的流加密算法,由 *Daniel J. Bernstein*(丹尼尔·伯恩斯坦) 于 2005 年设计。Salsa20 有两个变体 Salsa20/12 和 Salsa20/8,算法相同,只不过加密轮数不同,原版是 20 次,变体分别是 12 次和 8 次。 + +ChaCha 是 Salsa20 算法的改进版本,同样由 *Daniel* 设计,2008 年提出。ChaCha 的速度更快,加密强度更高。 + +Salsa20 和 ChaCha 是目前流加密算法的佼佼者。 \ No newline at end of file