Cryptography

2024-07-11

前言

常见的密码算法编写可看Re 常见加解密算法识别与加解密脚本
(又是一个自导自演~

1. 密码学三要素

这是一个~

1. Confidentiality(机密性)
就是不希望A和B的通信内容被第三方C看到~

2. integrity(完整性)
就说不希望A和B的通信内容被第三方篡改~

3. Authenticity(真实性)
就是希望A真的是和B在通话,而不是装成B的C

简单的加解密逻辑:

加密: 明文在key和加密函数的作用下得到密文。

解密: 密文在key和解密函数的作用下得到明文

2. One-Time Pad (OTP)

OTP,别称一次性密码本,是很经典的古典加密方法之一。
它的加解密方法如下:

加密方式:
1. Randomly generate a key: 随机生成一个key
    其中key的每一个bit为0/1的概率相等
2. 把明文plaintext与key的每一个bit进行xor操作,得到密文ciphertext
    这能保证明文中每个比特被翻转的概率相等

解密方式:
把ciphertext的每个比特与key的每个比特进行xor操作,就能得到明文plaintext
    因为xor的操作是可逆的:
    (a ⊕ b) ⊕ b = a ⊕ (b ⊕ b) = a ⊕ 0 = a

3. symmetric encrypt(对称加密)

在提到对称加密前,不得不提到混淆(confusion)与扩散(diffusion这两个操作了

3.1 Encryption Properties

混淆和扩散是当今密码学中,强加密算法的核心操作。

confusion:混淆
使密文的每个比特取决于密钥的几个部分,是一种使密钥与密文之间的关系尽可能模糊的加密操作。
如今实现混淆常用的一个元素就是替换;这个元素在 AES 和 DES 中都有使用。

diffusion:扩散
明文的1bit的改变可以导致整个密文有大约一半的比特位被改变。是一种为了隐藏明文的统计特性而将一个明文符号的影响扩散到多个密文符号的加密操作。
最简单的扩散元素就是位置换,它常用于 DES 中;而 AES 则使用更高级的 Mixcolumn 操作。

3.2 Advanced Encryption Standard(AES)

AES加密就是很常见的对称加密方式了。
加密:plaintext在 key和aes加密的作用下生成 ciphertext
解密:ciphertext在 key和aes解密的作用下生成 plaintext
但是有一点要注意,对于aes加密来说,key的长度和plaintext的每个block长度是有要求的:

Key Size: (128/192/256)-bits
Block Size: 128-bits

因此,对于明文为Hello, World!,长度是不足以用来加密的,所以需要padding,所谓padding,就是在plaintext的末尾添加几个字符,使plaintext能够满足加密的最小长度需要

3.2.1 aes padding: Padding with Null Bytes

顾名思义,就是在plaintext后面填充0字节

3.2.2 aes padding: Padding with PKC#7

这个padding的方式就是在末尾补齐字符,字符的值为要补齐的字节长度。
比如Hello, World!,长度为13,需要再补3个字节,所以值就是\x03\x03\x03
对于``Hello, World!Hello, World!,长度为26,需要再补6个字节,所以值就是\x06\x06\x06\x06\x06\x06`

3.3 AES加密模式

之前提供,aes加密每次只能加密plaintext的16个字节(一个block),所以根据每个block的加密的关联关系,划分了不同的加密模式

3.3.1 ECB(Electronic Codebook)

好处:ecb模式的每个block的加密都是独立的,可以并行运算
坏处:如果plaintext是有规律的,规律也会体现在ciphertext上

3.3.2 cbc(Cipher Blocking Chaining)

好处:plaintext的规律不会体现在ciphertext上
坏处:加密很慢,不能并行运算,必须要等前一块加密完后才能进行下一块的加密,另外,cbc模式即使不知道IV,在只知道key的情况下,也能解除除初始块以外的plaintext

3.3.3 CTR(Counter)

能并行计算,还能去除plaintext和ciphertext之间的关联!

4. key exchange

在网络环境中,A和B要想通信,不被C窃听消息,需要进行加密通信
然而,要用对称加密进行通信,需要A和B都有相同的key,才行
如果A和B直接把key发送到网络去,key也会被C窃听,那加密通信就没有意义
密钥交换算法Diffie-Hellman应运而生
anyway,相应的数学逻辑就不过多赘述(我也不会😄
在这里再推荐一下之前写得blogECDHE算法学习

5. Asymmetric encrypt(非对称加密)

数学真的是博大精深啊!
非对称加密起源与一些数学定理

5.1 Fermat’s little theorem(费马小定理)

5.2 Euler’s theorem(欧拉定理)

欧拉定理是费马小定理的推广,当然,(pq)也不能被a整除

5.3 RSA(Rivest-Shamir-Adleman)

RSA就是基于欧拉定理的运用得到的
rsa的key的生成过程如下图所示:
rsa的加密过程如下图所示:
当然,RSA的逆运用可以当作就是 签名(signature)

6. Hashing(哈希)

hashing指的是,对于任意长度的输入input,在进行hash操作后,得到固定长度的输出output
hashing是 one-way的,这意味着,一但input在进行hash操作得到output后,无法通过某种算法使output还原会input,你只能通过爆破(枚举)的手段来找
另外提一点,因为输入长度是随意的,输出长度固定,其实一定是存在不同的input,output是相同的。
所以这就引出了hash的某些抗抵抗性:

6.1 hashing Resistance Properties

6.2 password hashing (with salt)

在系统中存放密码都是存的hash
但是只是存放密码的hash是很容易爆破的(似乎有某些办法可以加快爆破速度)
于是salt应用而生:

6.3 Proof of work

hash也应用在区块链当中充当工作证明

7. Trust(证书)

证书的存在就是用于识别身份的,和身份证类似

8. 外传: RSA challenge-response

RSA challenge-response 是一种基于 RSA 公钥密码系统的身份验证协议,用于确认通信双方的身份。
这个协议通过挑战和应答的方式来验证身份,确保只有拥有正确私钥的一方才能通过验证。

以下是 RSA challenge-response 认证的基本流程:

密钥生成:
每个参与方(客户端和服务器)都有一对 RSA 密钥对(公钥和私钥)。
公钥是公开的,任何人都可以获取。私钥是保密的,只有密钥的拥有者知道。

挑战生成:
服务器生成一个随机数或字符串,称为挑战(challenge)。
这个挑战是一个一次性随机数,确保每次认证都是唯一的,防止重放攻击。

挑战加密:
服务器将挑战发送给客户端。
客户端使用其私钥对挑战进行加密,生成应答(response)。

应答发送:
客户端将加密后的应答发送回服务器。

应答验证:
服务器使用客户端的公钥对应答进行解密。
如果解密后的结果与最初的挑战一致,证明客户端拥有正确的私钥,认证成功。

9. python如何使用上述加密

from Crypto.Cipher import AES
from Crypto.PublicKey import RSA 
import hashlib
# 用上述3个库可以使用提到的加密方法
# 另外附加一些bytes - int 类型互转的问题
# 下列2个用法非常好用,在你收到网络报文,得到一串bytes表示的的secret/key等等时,可以直接用它转成整数类型,方便进行计算
value = int.from_bytes(bytes_object,"little")
bytes_object = value.to_bytes(256,"little")