如何解决在Python中实现AES / ECB / PKCS5填充
我正在尝试实现一个Python程序,以使用AES / ECB / PKCS5填充来加密纯文本。我得到的输出与预期的稍有不同。
Python3程序:
import base64
from Crypto.Cipher import AES
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode (value) # returns bytes
# Encryption method
def encrypt(text):
# Secret key
key='92oifgGh893*cj%7'
# Text to be encrypted
# Initialize encryptor
aes = AES.new(key,AES.MODE_ECB)
# Aes encryption to be
encrypt_aes = aes.encrypt(add_to_16(text))
# Converted into a string with base64
encrypted_text = str(base64.encodebytes (encrypt_aes),encoding = 'utf-8')
print(encrypted_text)
return encrypted_text
if __name__ == '__main__':
text = '{ "Message": "hello this is a plain text","user":"john.doe","Email":"john.doe@example.com}'
entrypted_text = encrypt(text)
以上程序的输出为:
oo8jwHQNQnBwVUsJ5piShFRM3PFFIfULwcoFOEQhPMTAvexSr6eE9aFLVQTpAKBFkGi8vNbtScvyexSxHBlwVapJ5Szz1JPR9q9cHHJYYMzGocln4TRPFQ6S3e8jjVud
与使用第三方工具online进行验证时一样,结果为:
oo8jwHQNQnBwVUsJ5piShFRM3PFFIfULwcoFOEQhPMTAvexSr6eE9aFLVQTpAKBFkGi8vNbtScvyexSxHBlwVapJ5Szz1JPR9q9cHHJYYMwnIIuNCUVn/IExpxebqXV1
有人可以指导我哪里做错了吗?
解决方法
PKCS 5(或7)填充不是添加0个字节,而是添加c
个字节with value
c (where
1 ) if you're c个字节,少于一个块长的倍数。
因此,如果您已经有16的倍数,请添加一个完整的16个字节的值16,并且如果您的最后一个块是'stop'(4个字节),我们将添加12个字节的值0xc
(12个字节(十六进制)填充块。等等
这样,接收者(在对最后一个块进行解密之后)可以检查最后一个字节c
并检查值是否为1 <= c <= 16
(如果不是,则拒绝解密),然后检查最后一个字节c
个字节确实都是 all 相同的值,然后从解密中将其删除。这样,接收方不必猜测最后一个块的多少字节只是填充,或实际上是纯文本的一部分。用PKCS方式毫无疑问。
我让编码留给你。
,我已将下面的代码与PKCS5一起填充,并按预期工作。
block_size=16
pad = lambda s: s + (block_size - len(s) % block_size) * chr(block_size - len(s) % block_size)
并且加密方法被重写如下:
def encrypt(plainText,key):
aes = AES.new(key,AES.MODE_ECB)
encrypt_aes = aes.encrypt(pad(plainText))
encrypted_text = str(base64.encodebytes (encrypt_aes),encoding = 'utf-8')
return encrypted_text
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。