- 安装依赖
pip install pycryptodome
- 生成key和iv
openssl rand -hex 16
- 说明
1. ECB(Electronic Codebook)模式:
IV:不需要。
说明:每个块独立加密,容易受到模式攻击,不推荐用于安全敏感的应用。
2. CBC(Cipher Block Chaining)模式:
IV:需要。
说明:每个块的加密依赖于前一个块的密文,提供更好的安全性。
3. CFB(Cipher Feedback)模式:
IV:需要。
说明:将加密的输出反馈到输入中,支持流加密。
4. OFB(Output Feedback)模式:
IV:需要。
说明:将加密的输出作为输入进行加密,适合流加密。
5. CTR(Counter)模式:
IV:需要(通常是一个计数器)。
说明:将计数器与密钥进行加密,然后与明文进行异或操作,支持并行处理
6. GCM(Galois/Counter Mode)模式:
IV:需要。
说明:结合了加密和认证,提供数据完整性和保密性。
- 示例1:AES 128位 CBC
# 示例 3588上耗时约2ms
key = bytes.fromhex("009ae63b3950b3ed6d9eec797d73753b")
iv = bytes.fromhex("12fe02f16123ea20dbb36507b3f4e9c0")
client_id = "0123456789"
password = "12345"
def encrypt_data():
# 加密
t_start = time.time()
cipher = AES.new(key, AES.MODE_CBC, iv) # 使用CBC模式
time_str = str(int(time.time() * 1000))
data = f"{client_id}\n{password}\n" + time_str
data = data.encode()
padded_data = pad(data, AES.block_size)
ciphertext = cipher.encrypt(padded_data)
ciphertext = ciphertext.hex()
print("========================", time.time() - t_start)
# 解密
ciphertext = bytes.fromhex(ciphertext)
decipher = AES.new(key, AES.MODE_CBC, iv=iv) # 使用相同的密钥和IV进行解密
decrypted_data = unpad(decipher.decrypt(ciphertext), AES.block_size)
print("解密后的明文:", decrypted_data.decode())
- 示例2:AES 128位 CBC
key = b"1234567890123456"
iv = b"abcdefghabcdefgh"
client_id = "0123456789"
password = "12345"
def encrypt_data():
# 加密
t_start = time.time()
time_str = str(int(time.time() * 1000))
data = f"{client_id}\n{password}\n" + time_str
data = data.encode()
padded_data = pad(data, AES.block_size)
cipher = AES.new(key, AES.MODE_CBC, iv) # 使用CBC模式
ciphertext = cipher.encrypt(padded_data)
ciphertext = base64.b64encode(ciphertext).decode()
print("加密后的密文:", ciphertext)
print("========================", time.time() - t_start)
# 解密
ciphertext = base64.b64decode(ciphertext)
decipher = AES.new(key, AES.MODE_CBC, iv=iv) # 使用相同的密钥和IV进行解密
decrypted_data = unpad(decipher.decrypt(ciphertext), AES.block_size)
print("解密后的明文:", decrypted_data.decode())
if __name__ == '__main__':
encrypt_data()
exit()