我想制作一个脚本来解密我的文件,但当我尝试运行脚本并向我显示此消息时,如何修复它?
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)"""
如果您的数据大小不大,那么在加密数据时可以使用以下小技巧。
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
有了原始的明文。
ValueError:输入字符串的长度必须是16的倍数
这是因为AES处理128位(16个字符)的块。可以考虑添加填充来修复这个问题。
来自加密维基。
块大小由AES::BLOCKSIZE决定。对于AES,这总是16字节
AES是一种块密码,它工作在16字节(128位)的块上。它不能处理小于或大于16字节的数据。较小的数据需要填充到16字节,较大的数据需要拆分成16字节的块。
还有一些算法可以帮助您实现这一点(处理大于密码块大小的数据),它们被称为块密码操作模式。
看看这个,如何使用AES加密超过16个字节?
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
运行以下代码时,如何解决此错误? 产出:
我在java类中发现了一个解密错误: 我能做些什么来解决这个问题? 更新: 我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
TCP客户端代码: 对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会得到illegalBlocksize异常。我尝试使用aes/cbc/pkcs5padding来填充消息,并且blocksize是16的倍数。但我还是得到了相同的错误或BadPaddingException。如果am指定PKCS5Padding作为填充技术,那么应该正确填充消息,而不应该给出此错误。为什么不起作用
服务器端: 客户端(解密):
服务器端: 客户端(解密):