Skip to content

Commit

Permalink
feat: update crypto 101
Browse files Browse the repository at this point in the history
  • Loading branch information
liuzhuan committed Nov 7, 2024
1 parent b6f64eb commit 126eca9
Showing 1 changed file with 34 additions and 1 deletion.
35 changes: 34 additions & 1 deletion _posts/2024-11-01-on-crypto-101.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 无需保密,可以伴随密文一同发送。但要保证它的不可预测性和唯一性。
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 是目前流加密算法的佼佼者。

0 comments on commit 126eca9

Please sign in to comment.