2017-05-08 477 views
1

我想制作一个脚本来解密我的文件,但是当我尝试运行我的脚本时,请向我显示此消息,我该如何解决它?AES:输入字符串的长度必须是16的倍数

Traceback (most recent call last): File "F:\bug_bounty\decrypt.py", line 46, in File "F:\bug_bounty\decrypt.py", line 24, in decrypt File "C:\Python27\lib\site-packages\Crypto\Cipher\blockalgo.py", line 295, in decrypt return self._cipher.decrypt(ciphertext) ValueError: Input strings must be a multiple of 16 in length

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)""" 
+1

http://stackoverflow.com/a/14205319/3527520可能是有用的代码应该 –

回答

0

ValueError: Input strings must be a multiple of 16 in length

这是因为AES作品128位(16个字符)的块。你可以考虑加入padding来解决这个问题。

+0

如何呢? (密钥,AES.MODE_CBC,IV) –

+0

@Aron帝国谷歌'pkcs7填充'或'零填充'他们''''''都很容易实现 –

0

Crypto++ wiki

The block size is determined by AES::BLOCKSIZE. For AES, this is always 16 bytes

AES是一种分组密码,它在16字节(128位)块上工作。它不能使用小于或大于16字节的数据。较小的数据需要为填充,直到它们是16字节,而较大的数据需要分成16字节的块。

此外还有一些算法可以帮助您实现这一点(对大于密码块大小的数据进行处理),它们被称为block cipher modes of operation

看一看这个How to encrypt more than 16 bytes using AES?

相关问题