Crypto101 是作为非数学专业,入门现代密码学不错的学习资料。本阅读笔记系列主要以一个程序员的视角来看待现代密码学。Crypto101 原文可以从官网下载到 www.crypto101.io

异或

异或$\oplus$操作是密码学中非常重要的一个运算。

基本运算规则如下:

1
2
3
4
0⊕0=0 
1⊕0=1
0⊕1=1
1⊕1=0

通过以上可以推出一些常用的其他规律:

  1. 异或运算可以任何顺序 $a \oplus b = b \oplus a$,即交换律
  2. 自己异或自己都是 0
  3. 任何比特异或 0 的结果都还是自己

通过上述规律,可以推导出 $a \oplus b \oplus a = b$。通过这个原则,可以认为 a 异或 b 是加密过程,再异或 a 就是解密过程。

完美的加密模式是,明文的每个比特都和一个真随机的比特 key 进行异或。但是这样缺点也很明显,key 会和明文一样长。

块加密

块加密(Block Cipher)即分组加密算法,允许对固定长度的块进行加密。

它使用加密函数 E,通过密钥 k 可以使得明文 P 变成密文 C:

$$ C = E(k, P) $$

明文和密文都是字节序列,这两者通常都拥有相同的长度,并且是被块加密算法规定好的一个长度,叫做块大小(block size)。所有可能的 key 被称为 keyspace,即键空间。

解密的过程相反,使用解密函数 D,通过和上面加密时一样的密钥 k 和密文 C,可以获得明文 P:

$$ P = D(k, C) $$

目前最常用的块加密算法是 AES。