在AES-128 CBC模式下,加密流末尾出现额外的块可能是因为加密数据的长度不是块大小的整数倍。以下是一个使用Python的Crypto库解决这个问题的示例代码:
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
# 定义密钥和IV
key = get_random_bytes(16)
iv = get_random_bytes(16)
# 定义明文
plaintext = "This is a test message."
# 创建AES加密器和解密器
cipher = AES.new(key, AES.MODE_CBC, iv)
decipher = AES.new(key, AES.MODE_CBC, iv)
# 加密明文
ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size))
# 解密密文
decrypted_data = unpad(decipher.decrypt(ciphertext), AES.block_size)
# 打印结果
print("Plaintext:", plaintext)
print("Ciphertext:", ciphertext)
print("Decrypted data:", decrypted_data.decode())
在上述代码中,我们使用Crypto库中的pad
函数来将明文填充到块大小的整数倍,并使用unpad
函数在解密时去除填充。这样可以确保加密数据的长度是块大小的整数倍,避免了在加密流末尾出现额外的块的问题。
请注意,如果明文长度已经是块大小的整数倍,则不需要进行填充。