diff --git a/_posts/2024-11-01-on-crypto-101.md b/_posts/2024-11-01-on-crypto-101.md new file mode 100644 index 0000000..6954758 --- /dev/null +++ b/_posts/2024-11-01-on-crypto-101.md @@ -0,0 +1,52 @@ +--- +layout: post +use_math: true +title: 计算机密码学入门 +date: 2024-11-01 +--- + +* TOC +{:toc} + +[Crypto 101](https://www.crypto101.io/) 是 [*Laurens Van Houtven*](https://www.lvh.io/about/) (lvh) 编写的一本关于密码学的开源电子书。 + +这本书适合各种水平程序员入门密码学。本书内容源自作者在 PyCon 2013 的[同名演讲](https://www.bilibili.com/video/BV1R64y1f7UE/)。 + +## XOR + +异或(Exclusive or, 简称 XOR)是一种位运算符,当两个比特不同时,返回 1。相同比特,返回 0。可以把异或看作**可编程的反相器**(programmable inverter)。 + +通常在数学中,使用 \\(\oplus\\) 表示异或运算符。 + +$$ +0 \oplus 0 = 0 \quad 1 \oplus 0 = 1 \quad +0 \oplus 1 = 1 \quad 1 \oplus 1 = 0 +$$ + +通常使用 \\(P_i\\) 表示明文(plaintext),\\(k_i\\) 表示密钥(key),\\(C_i\\) 表示密文(ciphertext)。其中的 \\(i\\) 表示索引。 + +$$ P_i \oplus k_i = C_i $$ + +异或运算拥有以下几个数学特性: + +1. 结合律:\\(a \oplus (b \oplus c) = (a \oplus b) \oplus c\\) +2. 交换律:\\(a \oplus b = b \oplus a \\) +3. 任意比特与自身进行异或,结果始终为 0:\\( a \oplus a = 0 \\) +4. 任意比特和 0 进行异或,结果不变:\\( a \oplus 0 = a \\) + +利用这些特性,可以容易推导出 \\( a \oplus b \oplus a = b \\) 。如果把公式中的 \\(a\\) 当做密钥,\\(b\\) 当做明文,那么 \\(a \oplus b\\) 相当于将明文加密,而 \\(a \oplus b \oplus a\\) 则相当于对密文解密。 + +在 Python 和 JavaScript 中,使用 `^` 表示异或运算符。 + +```js +6 ^ 5 //=> 3 + +// 相当于 +0b110 ^ 0b101 = 0b011 +``` + +## 一次性密码本 {#otp} + +一次性密码本(One-Time Pad, OTP)是一种加密方式,明文和密钥的比特长度相同,密钥位数完全随机且只能使用一次。这是一种在理论上堪称完美的加密方式。 + +但是 OTP 的缺点在于密钥的管理和分发。 \ No newline at end of file