浅谈对称加密(AES与DES)
对称加密是一种加密方式,其中同一个密钥(也称为私钥或共享密钥)用于加密和解密数据。这意味着加密和解密都使用相同的密钥。对称加密速度通常很快,因为它不涉及复杂的数学运算。
对称加密的示例步骤:
选择密钥:双方协商并选择一个密钥,在实际应用中确保密钥的安全性至关重要。
加密数据:使用所选密钥对明文数据进行加密,生成密文。
传输密文:将密文传输给接收方。
解密数据:接收方使用相同的密钥对接收到的密文进行解密,还原出原始明文数据。
对称加密算法有许多种,如 AES(高级加密标准)、DES(数据加密标准)等。在对称加密中,由于加密和解密使用相同的密钥,因此密钥的安全传输和存储对于确保数据机密性至关重要。
安装:
pip3 install pycrpytodome
AES(Advanced Encryption Standard)是一种对称密钥加密算法,最常用的模式ECB 模式和CBC模式,当然还有很多其他模式,都属于AES加密。ECB模式和CBC模式两者区别就是ECB不需要iv偏移量,而CBC需要。
在 AES 加密中,ECB(Electronic Codebook)模式和 CBC(Cipher Block Chaining)模式是两种常见的加密模式。以下是它们的参数、作用以及数据类型:
ECB 模式(电子密码本模式)
1. **参数**:
- **密钥(Key)**:对称密钥,用于加密和解密数据块。
- **初始向量(IV)**:在 ECB 模式下通常不需要使用初始向量。
2. **作用**:
- 将明文分成固定大小的数据块,然后独立地对每个数据块使用相同的密钥进行加密。
- 易于实现和理解,适合对数据块进行独立加密的场景。
3. **数据类型**:
- **明文(Plaintext)**:待加密的原始数据。
- **密文(Ciphertext)**:经过 ECB 模式加密后的数据。
CBC 模式(密码分组链接模式)
1. **参数**:
- **密钥(Key)**:对称密钥,用于加密和解密数据块。
- **初始向量(IV)**:每次加密操作都需要一个唯一的初始向量,用于在数据块之间引入依赖性。
2. **作用**:
- 在加密之前,与前一个数据块的密文进行异或运算,增加了数据块之间的关联性,提高了安全性。
- 使得每个密文块的输出都依赖于前一个数据块的加密结果,因此有更好的混淆效果。
3. **数据类型**:
- **明文(Plaintext)**:待加密的原始数据。
- **密文(Ciphertext)**:经过 CBC 模式加密后的数据
。
这些是 AES 加密中 ECB 和 CB```js
C 模式的主要参数、作用和数据类型。选择合适的加密模式取决于具体的安全需求和应用场景。
CBC加密案例
from Crypto.Cipher import AES
import base64
key = '1234567890abcdef'.encode() # 密钥
# 密钥:必须是16位字节或者24位字节或者32位字节
text = 'philips is dsb!!'
# text = 'philips is dsb' 需要加密的内容
# while len(text.encode('utf-8')) % 16 != 0: # 如果text不足16位的倍数就用空格补足16位
# text += '\0'
text = text.encode()
print('完整text:', text)
iv = b'abcdabcdabcdabcd' # 偏移量--必须16字节
aes = AES.new(key, AES.MODE_CBC, iv) # 创建一个aes对象
en_text = aes.encrypt(text) # 加密明文
print('aes加密数据:::', en_text)
en_text = base64.b64encode(en_text).decode() # 将返回的字节型数据转进行base64编码
print(en_text)
运行结果如下:
完整text: b'philips is dsb!!'
aes加密数据::: b'\xb0\x8fxbf1\xec\xfaW\xc5o\xa5\xa5\xc1_\x0f'
sI94YmYx7PpXxW+lpcFfDw==
CBC解密案例:
from Crypto.Cipher import AES
import base64
key = '1234567890abcdef'.encode() # 密钥
model = AES.MODE_CBC
iv = b'abcdabcdabcdabcd'
aes = AES.new(key, model, iv)
text = 'SrACs3J3tfAONPPwxzMMfg=='.encode()
ecrypted_base64 = base64.b64decode(text) # base64解码成字节流
str = aes.decrypt(ecrypted_base64).decode() # 解密
print('aes解密数据:::', str)
运行结果如下:
aes解密数据::: phips is dsb!!!