1.AES对称加密
1.1 什么是 AES 加密?
AES(Advanced Encryption Standard,高级加密标准)是一种 对称分组加密算法,由美国国家标准与技术研究院(NIST)于 2001 年确立。它以其高效性和安全性成为数据加密的国际标准,广泛应用于数据保护场景。
1.2 AES 的主要特点
-
对称加密:加密和解密使用相同的密钥。
-
分组加密:AES 将数据分成固定大小的块进行加密,块大小固定为 128 位(16 字节)。
-
密钥长度可选:支持 128 位、192 位和 256 位密钥长度,不同长度决定安全性等级和加密速度。
-
安全性高:AES 对抗目前已知的大多数攻击方法,适合保护敏感数据。
1.3 AES 的工作原理
1. 输入数据
-
明文:待加密的数据,分成 128 位(16 字节)分组。
-
密钥:用户提供的密钥,长度为 128 位(16 字节)、192 位(24 字节)或 256 位(32 字节)。
-
模式:加密时可以选择不同的工作模式(如 ECB、CBC、CFB、OFB)。
2. 加密过程
AES 的加密过程由多轮转换组成,每轮包含以下几个步骤:
-
SubBytes(字节替换):用一个固定的 S-box 表将每个字节替换为另一个字节。
-
ShiftRows(行移位):对数据块中的每一行进行循环左移。
-
MixColumns(列混淆):对数据块中的每列应用一个数学变换,使数据在列内扩散。
-
AddRoundKey(密钥加轮):将当前密钥和数据块按位 XOR。
注:最后一轮不执行
MixColumns
。
3. 解密过程
解密与加密是对称的,主要是加密过程的逆操作:
-
逆替换字节。
-
逆移位。
-
逆列混淆。
-
逆密钥加轮。
1.4 AES 的工作模式
AES 仅是加密的核心算法,结合不同模式才能实现完整的加密方案。常见模式有:
-
ECB(电子密码本模式):每个分组独立加密。 优点:简单高效;缺点:容易暴露明文模式。
-
CBC(密码分组链接模式):每个分组加密依赖前一个分组的密文,首块用初始化向量(IV)。 优点:安全性高;缺点:解密必须按顺序进行。
-
CFB(加密反馈模式):将密文的一部分作为下一次加密的输入。 优点:可以加密长度非分组倍数的数据;缺点:依赖性较高。
-
OFB(输出反馈模式):用一个伪随机数生成器生成密钥流。 优点:适合流式加密;缺点:对 IV 的随机性要求高。
-
GCM(Galois/Counter 模式):一种结合了加密和认证功能的模式。 优点:高效且能防篡改,适合网络通信。
1.5 AES 加密的实际操作
使用 pycryptodome 库实现 AES 加密:
from Crypto.Cipher import AES
import base64
# 填充函数,使明文长度是 16 字节的倍数
def pad(text):
return text + (16 - len(text) % 16) * chr(16 - len(text) % 16)
# 去填充函数
def unpad(text):
return text[:-ord(text[-1])]
# AES 加密函数
def encrypt_aes(key, plaintext):
key = key.encode('utf-8') # 密钥转换为字节类型
plaintext = pad(plaintext).encode('utf-8') # 明文填充并转换为字节类型
cipher = AES.new(key, AES.MODE_CBC, iv=b'0123456789abcdef') # 使用 CBC 模式和固定的 IV
encrypted = cipher.encrypt(plaintext) # 加密
return base64.b64encode(encrypted).decode('utf-8') # 返回 Base64 编码的密文
# AES 解密函数
def decrypt_aes(key, ciphertext):
key = key.encode('utf-8')
ciphertext = base64.b64decode(ciphertext) # 解码 Base64 密文
cipher = AES.new(key, AES.MODE_CBC, iv=b'0123456789abcdef') # 使用 CBC 模式和相同的 IV
decrypted = cipher.decrypt(ciphertext) # 解密
return unpad(decrypted.decode('utf-8'))
# 示例
key = "MySecretKey12345" # 16 字节密钥
message = "This is a secret message"
# 加密
encrypted_message = encrypt_aes(key, message)
print("加密后的消息:", encrypted_message)
# 解密
decrypted_message = decrypt_aes(key, encrypted_message)
print("解密后的消息:", decrypted_message)
1.6 AES 的优缺点
优点
-
高安全性:AES 是当前已知最安全的对称加密算法之一。
-
速度快:加密速度快,适合大数据量加密。
-
硬件支持:很多硬件支持 AES 指令集,进一步提升性能。
缺点
-
密钥管理难:密钥泄露会导致数据完全暴露。
-
固定分组大小限制:数据必须是分组大小的整数倍,需填充。
1.7 应用场景
-
网络通信加密(如 HTTPS)
-
文件加密(如 ZIP 文件加密)
-
无线通信协议(如 WPA2 协议)
-
数据库加密(如 MySQL 加密)
AES 凭借其安全性和性能,在现代信息安全中扮演着重要角色。
AES要求密钥长度必须是 16字节、24字节或32字节。
2.RSA非对称加密
RSA 加密是一种基于 非对称加密算法 的数据加密技术。由 Rivest、Shamir 和 Adleman 于 1977 年发明,RSA 也是这三位发明者名字的首字母缩写。它广泛用于安全数据传输,尤其在数字签名和密钥交换中起到核心作用。
2.1 RSA 加密的主要特点
-
非对称加密:RSA 使用一对密钥:公钥(公开)和私钥(保密)。
-
公钥用于加密数据。
-
私钥用于解密数据。
-
-
数学基础:依赖于大整数分解的困难性,因此安全性与密钥长度成正比。
-
安全性高:即使拥有公钥,也几乎不可能反推出私钥。
-
速度较慢:相比对称加密(如 AES),RSA 加密速度较慢,适合加密少量数据(如密钥)。
2.2 RSA 的工作原理
1. 密钥生成
RSA 基于以下数学过程生成密钥对:
-
选择两个大素数 pp 和 qq。
-
计算 n=p⋅qn = p \cdot q:nn 是公钥和私钥的一个组成部分。
-
计算欧拉函数 ϕ(n)=(p−1)⋅(q−1)\phi(n) = (p-1) \cdot (q-1)。
-
选择公钥指数 ee:ee 与 ϕ(n)\phi(n) 互质,常用值为 65537。
-
计算私钥指数 dd:dd 是 ee 关于 ϕ(n)\phi(n) 的模反元素,满足: e⋅d≡1 (mod ϕ(n))e \cdot d \equiv 1 \ (\text{mod} \ \phi(n))
最终:
-
公钥为 (e,n)(e, n)
-
私钥为 (d,n)(d, n)
2. 加密
数据加密使用公钥 (e,n)(e, n)。加密公式为:
C=Me (mod n)C = M^e \ (\text{mod} \ n)
其中:
-
MM:明文(以数值形式表示)。
-
CC:密文。
3. 解密
解密使用私钥 (d,n)(d, n)。解密公式为:
M=Cd (mod n)M = C^d \ (\text{mod} \ n)
其中:
-
CC:密文。
-
MM:明文。
由于 ee 和 dd 是互为模反的,解密可以还原原始数据。
2.3 RSA 的应用场景
-
数据加密:使用公钥加密敏感信息,确保只有持有私钥的人可以解密。
-
数字签名:使用私钥对数据进行签名,接收方用公钥验证签名,确认数据来源和完整性。
-
密钥交换:安全地传输对称加密的密钥(如 AES 密钥)。
-
身份认证:用于认证通信双方的身份。
2.4 RSA 的优缺点
优点
-
高安全性:基于大整数分解问题,目前无法通过有效算法破解。
-
无需共享密钥:公钥可以公开,私钥保密,避免密钥分发问题。
-
多功能性:既能加密,也能用于签名和认证。
缺点
-
速度较慢:加解密效率较低,通常用于少量数据加密。
-
密文长度增加:加密后数据长度增加。
-
安全性依赖密钥长度:较短的密钥容易被暴力破解。
2.5 实际操作
pyhton:使用 PyCryptodome 实现 RSA 加密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
import base64
# 生成 RSA 密钥对
key = RSA.generate(2048) # 2048 位密钥
private_key = key.export_key()
public_key = key.publickey().export_key()
# 打印公钥和私钥
print("私钥:", private_key.decode('utf-8'))
print("公钥:", public_key.decode('utf-8'))
# 加密函数
def encrypt_rsa(public_key, plaintext):
pub_key = RSA.import_key(public_key)
cipher = PKCS1_OAEP.new(pub_key)
encrypted = cipher.encrypt(plaintext.encode('utf-8'))
return base64.b64encode(encrypted).decode('utf-8')
# 解密函数
def decrypt_rsa(private_key, ciphertext):
priv_key = RSA.import_key(private_key)
cipher = PKCS1_OAEP.new(priv_key)
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
return decrypted.decode('utf-8')
# 示例用法
message = "This is a secret message"
encrypted_message = encrypt_rsa(public_key, message)
print("加密后的消息:", encrypted_message)
decrypted_message = decrypt_rsa(private_key, encrypted_message)
print("解密后的消息:", decrypted_message)
2.6 总结
特性 | 描述 |
---|---|
密钥类型 | 公钥加密,私钥解密(或反过来) |
安全性 | 基于大整数分解问题,安全性高 |
速度 | 相较于对称加密(如 AES),速度较慢 |
用途 | 用于加密少量数据、签名验证和密钥交换 |