当前位置: 首页 > 知识库问答 >
问题:

AES:输入字符串的长度必须是16的倍数

严兴旺
2023-03-14

我想制作一个脚本来解密我的文件,但当我尝试运行脚本并向我显示此消息时,如何修复它?

Traceback(最近一次调用):File"F:\bug_bounty\decrypt.py",第46行,在File"F:\bug_bounty\decrypt.py",第24行,在decrypt File"C:\Python27\lib\site-包\Crypto\Cipher\blockalgo.py",行_cipher.decrypt(密文)值错误:输入字符串的长度必须是16的倍数

from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import os
import random
import sys


def decrypt(key, filename):
    outFile = os.path.join(os.path.dirname(filename),
                           os.path.basename(filename[11:]))
    chunksize = 64 * 1024
    with open(filename, 'rb') as infile:
        filesize = infile.read(16)
        IV = infile.read(16)

        decryptor = AES.new(key, AES.MODE_CBC, IV)

        with open(outFile, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break

                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(int(filesize))


def allfiles():
    allFiles = []
    for (root, subfiles, files) in os.walk(os.getcwd()):
        for names in files:
            allFiles.append(os.path.join(root, names))

    return allFiles


password = 'M4st3rRul3zs'
files = allfiles();
for filename in files:
    if os.path.basename(filename).startswith("(encrypted)"):
       print "%s is already encrypted" %filename
       pass

    else:  
        decrypt(SHA256.new(password).digest(), filename)
        print "Done decrypting %s" %filename
        """os.remove(filename)"""

共有3个答案

施喜
2023-03-14

如果您的数据大小不大,那么在加密数据时可以使用以下小技巧。

plaintext = "some text"
encryptor = AES.new(key, AES.MODE_CBC, iv)
ciphertext = encryptor.encrypt(plaintext*16)

这将确保您的输入数据是16的倍数。当然,在解密时,您希望恢复原始数据。

cipher = AES.new(key, AES.MODE_CBC, iv)
decrypttext = cipher.decrypt(ciphertext)
decrypttext = decrypttext[0:len(plaintext)]

现在,decrypytext有了原始的明文。

闻人伟
2023-03-14

ValueError:输入字符串的长度必须是16的倍数

这是因为AES处理128位(16个字符)的块。可以考虑添加填充来修复这个问题。

易宏阔
2023-03-14

来自加密维基。

块大小由AES::BLOCKSIZE决定。对于AES,这总是16字节

AES是一种块密码,它工作在16字节(128位)的块上。它不能处理小于或大于16字节的数据。较小的数据需要填充到16字节,较大的数据需要拆分成16字节的块。

还有一些算法可以帮助您实现这一点(处理大于密码块大小的数据),它们被称为块密码操作模式。

看看这个,如何使用AES加密超过16个字节?

 类似资料: