Add files via upload
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
### RSA 算法原理
|
||||
|
||||
RSA 算法是一种非对称加密算法,它的名字来源于三位发明者 Rivest、Shamir 和 Adleman 的姓氏首字母。与对称加密不同,非对称加密使用一对密钥:**公钥**和**私钥**。公钥可以公开给任何人,用于加密数据;而私钥必须由用户自己保管,用于解密数据。RSA 的核心在于利用了两个数学难题:**大整数质因数分解**和**欧拉函数**
|
||||
|
||||
**密钥生成过程**
|
||||
|
||||
密钥生成是 RSA 算法的基础,这个过程决定了公钥和私钥的值
|
||||
|
||||
1. **选择大质数**:随机选择两个非常大的质数 p 和 q。为了确保安全性,这两个质数必须足够大且不能太接近
|
||||
|
||||
2. **计算模数**:计算它们的乘积 `n=p×q`。这个 n 就是 RSA 的模数,它既是公钥的一部分,也是私钥的一部分
|
||||
|
||||
3. **计算欧拉函数**:计算欧拉函数 `ϕ(n)=(p−1)(q−1)`。欧拉函数 ϕ(n) 表示小于或等于 n 且与 n 互质的正整数的个数
|
||||
|
||||
4. **选择公钥指数**:选择一个整数 e,它必须满足以下条件:
|
||||
|
||||
- `1<e<ϕ(n)`
|
||||
|
||||
- e 与 ϕ(n) 互质(即最大公约数为 1)
|
||||
|
||||
通常,为了计算效率,会选择一些常见的质数,比如 65537。这个 e 就是公钥的指数
|
||||
|
||||
5. **计算私钥指数**:计算一个整数 d,它必须满足以下条件:
|
||||
|
||||
- `d × e ≡ 1 (mod ϕ(n))`
|
||||
|
||||
这个等式意味着 `d × e` 除以 ϕ(n) 的余数为 1。我们可以使用扩展欧几里得算法来高效地找到这个 d。这个 d 就是私钥的指数
|
||||
|
||||
至此,密钥生成完成。**公钥为 (n,e)**,可以公开;**私钥为 (n,d)**,必须严格保密
|
||||
|
||||
**加密和解密过程**
|
||||
|
||||
有了公钥和私钥,就可以进行数据的加密和解密了
|
||||
|
||||
**加密**
|
||||
|
||||
假设发送方想向你发送一条消息 M
|
||||
|
||||
1. 发送方获取你的公钥 (n,e)
|
||||
|
||||
2. 将明文消息 M 转换为一个整数(通常通过 ASCII 或其他编码方式)
|
||||
|
||||
3. 使用公钥进行加密,计算密文 C:
|
||||
|
||||
`C = Me (mod n)`
|
||||
|
||||
**解密**
|
||||
|
||||
当接收方收到密文 C 后,就可以使用自己的私钥进行解密
|
||||
|
||||
1. 接收方使用自己的私钥 (n,d)
|
||||
|
||||
2. 使用私钥进行解密,计算出原始明文 M:
|
||||
|
||||
`M = C^d (mod n)`
|
||||
|
||||
这里看起来很简单,但其背后的数学原理是:
|
||||
|
||||
```
|
||||
(M^e)^d ≡ M^ed ≡ M (mod n)
|
||||
```
|
||||
|
||||
这正是**欧拉定理**在起作用,它保证了加密和解密的可逆性
|
||||
@@ -0,0 +1,27 @@
|
||||
### AES 算法原理
|
||||
|
||||
**AES 的核心概念**
|
||||
|
||||
在深入原理之前,需要先了解 AES 的几个基本概念:
|
||||
|
||||
- **分组加密**:AES 是一种分组密码,它将明文数据分割成固定大小的**数据块**(block)进行加密。AES 的数据块大小固定为 **128 位**
|
||||
- **密钥长度**:AES 支持三种密钥长度:**128 位、192 位和 256 位**。密钥长度越长,加密强度越高,但计算量也会相应增加
|
||||
- **加密轮数**:加密过程由一系列重复的“轮”(rounds)组成。不同的密钥长度对应不同的轮数:
|
||||
- 128 位密钥:10 轮
|
||||
- 192 位密钥:12 轮
|
||||
- 256 位密钥:14 轮
|
||||
|
||||
**加密过程的四大步骤**
|
||||
|
||||
每一次加密轮都由四个基本操作构成,这些操作保证了加密过程的复杂性
|
||||
|
||||
1. **字节替换(SubBytes)** 这是**代换**操作。AES 使用一个预先定义好的 **S-Box**(Substitution-Box),将数据块中的每个字节替换成 S-Box 中对应的另一个字节。这个操作是非线性的,目的是为了隐藏明文和密文之间的直接代数关系
|
||||
2. **行移位(ShiftRows)** 这是**置换**操作。它将数据块中的每一行进行循环左移。具体来说:
|
||||
- 第 0 行保持不变
|
||||
- 第 1 行循环左移 1 个字节
|
||||
- 第 2 行循环左移 2 个字节
|
||||
- 第 3 行循环左移 3 个字节。 这个操作实现了数据字节在不同列之间的扩散,增加了密码的混淆程度
|
||||
3. **列混淆(MixColumns)** 这也是**置换**操作。这个步骤对每一列进行矩阵乘法运算。通过这个操作,每一列中的每个字节都会影响到该列中其他字节的值。这进一步加大了数据的扩散,确保了明文中的微小变化能够导致密文的巨大变化
|
||||
4. **轮密钥加(AddRoundKey)** 这是**异或**(XOR)操作。在每一轮开始时,都会将当前数据块与**本轮的密钥**进行异或运算。这个操作将密钥信息注入到数据中,是整个加密过程的关键步骤。每一轮使用的密钥都是由初始密钥经过**密钥扩展**算法生成的
|
||||
|
||||
这四个步骤按顺序重复执行多次,最后**在最后一轮会省略列混淆步骤**。解密过程则反向执行这四个步骤
|
||||
@@ -0,0 +1,22 @@
|
||||
### 说一下非对称加密算法的加密过程
|
||||
|
||||
**加密过程详解**
|
||||
|
||||
非对称加密的整个过程可以分为以下几个关键步骤:
|
||||
|
||||
1. **密钥生成**: 首先,接收方(比如你)会生成一对密钥:一个**公钥**和一个**私钥**。这个过程通常基于复杂的数学难题,例如大整数分解(RSA 算法)或椭圆曲线上的离散对数问题(ECC 算法)
|
||||
|
||||
- **公钥**:可以公开给任何人,就像你的电子邮箱地址
|
||||
- **私钥**:必须严格保密,只有你自己能访问,就像你的邮箱密码
|
||||
|
||||
2. **公钥分发**: 当发送方(比如你的朋友)想要给你发送加密信息时,他首先需要获得你的公钥。你可以通过一个安全的渠道,例如你的网站、社交媒体账号或证书颁发机构,将公钥发给你的朋友
|
||||
|
||||
3. **消息加密**: 你的朋友拿到你的公钥后,就可以开始加密信息了。他将原始的明文信息(如“你好”)转换成数字格式,然后使用你的**公钥**和加密算法对信息进行加密。 加密后的信息会变成一串看似随机的乱码,这就是**密文**
|
||||
|
||||
**加密原理**: `密文 = 加密算法 (明文, 接收方的公钥)`
|
||||
|
||||
4. **密文传输**: 加密完成后,你的朋友就可以将密文通过不安全的渠道发送给你,例如电子邮件、即时通讯软件或短信。即使这段信息在传输过程中被截获,攻击者也无法通过公钥解密出原始信息,因为公钥只能用于加密,不能用于解密
|
||||
|
||||
5. **消息解密**: 当你收到密文后,你需要使用你自己的**私钥**来解密。你将密文输入解密算法,并使用你的私钥进行运算,最终得到原始的明文信息
|
||||
|
||||
**解密原理**: `明文 = 解密算法 (密文, 接收方的私钥)`
|
||||
@@ -0,0 +1,25 @@
|
||||
### 有哪些了解过的非对称加密算法
|
||||
|
||||
**1. RSA 算法**
|
||||
|
||||
**RSA** 是最著名的非对称加密算法之一,它的名字来源于三位发明者 Rivest、Shamir 和 Adleman 的姓氏首字母
|
||||
|
||||
- **核心原理**:它的安全性基于**大整数质因数分解**的数学难题。这意味着,即使知道两个非常大的质数相乘得到的乘积,也很难在合理时间内将这个乘积分解回原来的两个质数
|
||||
- **优点**:历史悠久,经过了长时间的考验和广泛应用,安全性被普遍认可
|
||||
- **缺点**:相比其他算法,其密钥长度通常需要更长来达到相同的安全级别,导致加密和解密速度较慢
|
||||
|
||||
**2. ECC(椭圆曲线密码学)算法**
|
||||
|
||||
**ECC** 是一种基于**椭圆曲线**数学的非对称加密算法
|
||||
|
||||
- **核心原理**:它的安全性基于**椭圆曲线上的离散对数问题**。这个问题的难度要比大整数分解问题高得多
|
||||
- **优点**:在相同的安全强度下,ECC 的密钥长度比 RSA 短得多。例如,一个 256 位的 ECC 密钥提供的安全性,与一个 3072 位的 RSA 密钥大致相当。更短的密钥意味着更高的计算效率和更小的存储空间,这对于移动设备和物联网等资源受限的环境非常有利
|
||||
- **缺点**:数学原理更复杂,实现起来也更困难
|
||||
|
||||
**3. DSA(数字签名算法)**
|
||||
|
||||
**DSA** 是一种主要用于**数字签名**的非对称加密算法
|
||||
|
||||
- **核心原理**:它基于**离散对数问题**,与 Diffie-Hellman 密钥交换算法的数学基础类似
|
||||
- **优点**:专为数字签名设计,效率较高。它只用于签名,不用于数据加密
|
||||
- **缺点**:只能用于签名和验证,不能用于数据的加密和解密
|
||||
@@ -0,0 +1,34 @@
|
||||
### 栅栏密码的原理是什么
|
||||
|
||||
**加密原理**
|
||||
|
||||
栅栏密码的原理是,将明文的字母像写在交错的栅栏上一样,然后按行读取
|
||||
|
||||
1. **选择密钥**:首先,你需要选择一个密钥,这个密钥就是一个整数,表示“栅栏”的层数。例如,密钥为 3,就表示有 3 层栅栏
|
||||
2. **构造栅栏**:将明文的字母按照“之”字形(zig-zag)的路径,依次填写到对应层数的栅栏上
|
||||
3. **按行读取**:加密后的密文就是将每一层栅栏上的字母,从上到下、从左到右依次连接起来
|
||||
|
||||
**示例:**
|
||||
|
||||
- **明文**:`WE ARE DISCOVERED. FLEE AT ONCE.`
|
||||
- **密钥**:`3`
|
||||
|
||||
我们将明文写在 3 层栅栏上:
|
||||
|
||||
现在,我们按行读取,忽略点号,只提取字母:
|
||||
|
||||
- **第一行**:`WEDOEE`
|
||||
- **第二行**:`ERDSOEFETNC`
|
||||
- **第三行**:`AICSVRAOC`
|
||||
|
||||
将三行连接起来,就得到了密文:
|
||||
|
||||
**密文**:`WEDOEE ERDSOEFETNC AICSVRAOC`
|
||||
|
||||
**解密原理**
|
||||
|
||||
解密过程是加密的逆向操作,你需要知道密钥和密文的长度
|
||||
|
||||
1. **计算每行长度**:根据密钥和密文长度,计算出每一层栅栏上的字母数量
|
||||
2. **重构栅栏**:根据计算出的数量,将密文依次填回到“之”字形的栅栏结构中
|
||||
3. **按“之”字形读取**:最后,按照原来的“之”字形路径,依次读取每个位置上的字母,就能还原出原始明文
|
||||
@@ -0,0 +1,34 @@
|
||||
### Padding Oracle Attack 讲讲
|
||||
|
||||
**攻击的核心原理**
|
||||
|
||||
要理解这个攻击,我们首先需要了解几个关键概念:
|
||||
|
||||
**1. 分组密码和 CBC 模式**
|
||||
|
||||
- **分组密码**将明文分割成固定大小的**分组**进行加密
|
||||
- **CBC(密文分组链接)模式**是一种常用的分组密码模式。在 CBC 模式中,每个明文分组在加密前,会先与前一个密文分组进行**异或**(XOR)运算。这使得每个密文分组都依赖于其之前的所有分组,从而提供了更好的安全性
|
||||
- **IV(初始化向量)**:第一个明文分组加密时没有前一个密文分组,因此需要一个**初始化向量**(IV)来代替
|
||||
|
||||
**2. 填充(Padding)**
|
||||
|
||||
为了确保最后一个明文分组能够填满整个分组长度,需要进行**填充**。例如,如果分组大小是 16 字节,而最后一个明文分组只有 13 字节,就需要填充 3 个字节。 **PKCS#7 填充**是常用的填充标准。它将填充的每个字节都设置为填充的长度。例如,如果需要填充 3 个字节,就会在明文末尾添加 `0x03 0x03 0x03`。解密后,系统会检查最后一个字节的值,并移除相应数量的填充
|
||||
|
||||
**攻击的步骤**
|
||||
|
||||
Padding Oracle Attack 利用的就是**填充验证机制**的漏洞。攻击者通过发送修改后的密文到服务器,并观察服务器是否返回“填充正确”或“填充错误”的信息。这个“神谕”(Oracle)就是指服务器的这个响应行为
|
||||
|
||||
攻击者可以**逐字节地**解密密文。假设我们要解密密文分组 Cn:
|
||||
|
||||
1. **构造密文**:攻击者需要控制一个密文分组 Cn−1′(通常是伪造的)和一个目标密文分组 Cn
|
||||
2. **暴力破解**:攻击者会尝试 Cn−1′ 的最后一个字节,从 0 到 255 遍历所有可能的值
|
||||
3. **发送给服务器**:将伪造的 `(IV + C_0 + ... + C_{n-2} + C_{n-1}' + C_n)` 发送给服务器
|
||||
4. **观察响应**:
|
||||
- 如果服务器返回**“填充正确”**,说明填充字节的解密结果为 `0x01`
|
||||
- 如果服务器返回**“填充错误”**,说明填充字节的解密结果不为 `0x01`
|
||||
5. **推导**:
|
||||
- 当我们找到一个让服务器返回“填充正确”的 Cn−1′ 时,根据CBC模式的解密公式: `$P_n = D(C_n) \oplus C_{n-1}$`
|
||||
- 那么,伪造的密文解密后,其最后一个明文字节为 `0x01`: `$P_n'[last] = D(C_n)[last] \oplus C_{n-1}'[last] = 0x01$`
|
||||
- 我们可以推导出 `D(C_n)[last]` 的值: `$D(C_n)[last] = P_n'[last] \oplus C_{n-1}'[last] = 0x01 \oplus C_{n-1}'[last]$`
|
||||
- 既然我们已经知道了 D(Cn) 的最后一个字节,我们就可以用同样的方法,依次解密倒数第二个字节、倒数第三个字节……
|
||||
- 每解密一个字节,攻击者就构造一个新的 Cn−1′,使得它能让下一个填充字节的解密结果为 `0x02`,然后继续这个过程,直到解密完整个分组
|
||||
Reference in New Issue
Block a user