-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
52 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 的缺点在于密钥的管理和分发。 |