Skip to content

Commit

Permalink
feat: add crypto 101
Browse files Browse the repository at this point in the history
  • Loading branch information
liuzhuan committed Nov 1, 2024
1 parent 0cb12c8 commit df5d33b
Showing 1 changed file with 52 additions and 0 deletions.
52 changes: 52 additions & 0 deletions _posts/2024-11-01-on-crypto-101.md
Original file line number Diff line number Diff line change
@@ -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 的缺点在于密钥的管理和分发。

0 comments on commit df5d33b

Please sign in to comment.