在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":"[email protected]}'
    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