当明文大小不是块大小的倍数时,可以使用填充(padding)来解决这个问题。填充是在明文末尾添加额外的字节,使得明文的大小能够被块大小整除。
以下是一个使用填充的示例代码,使用Python的Crypto库实现AES 128 CTR加密算法:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
def encrypt(plaintext, key):
cipher = AES.new(key, AES.MODE_CTR)
ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
return ciphertext
def decrypt(ciphertext, key):
cipher = AES.new(key, AES.MODE_CTR)
plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
return plaintext
key = os.urandom(16) # 生成一个随机的16字节密钥
plaintext = b'This is a sample plaintext.'
ciphertext = encrypt(plaintext, key)
print("Ciphertext:", ciphertext)
decrypted_plaintext = decrypt(ciphertext, key)
print("Decrypted plaintext:", decrypted_plaintext)
在上述代码中,pad()
和unpad()
函数用于填充和去除填充。pad()
函数会将明文填充到块大小的倍数,unpad()
函数会去除填充。
请注意,在使用CTR模式加密时,填充只是用于在明文末尾添加额外的字节,以满足块大小的要求。解密时,再通过unpad()
函数去除填充,以还原原始明文。
这样,无论明文大小是否是块大小的倍数,都能够正确加密和解密。
上一篇:AES - 解密数据的差异