pyDes解密“数据必须是8个字节的倍数”

时间:2017-02-26 17:31:03

标签: python python-3.x encryption

我现在开始道,我的编程习惯不是很好。我已经从他们的网站修改了基本的pyDes代码:

import os, sys, binascii
text = input ("Text to be encrypted...")
key = input ("Key...")
sys.path.append (os.path.abspath ("").split (":") [0] + ":\\Python\\Libraries\\pyDes")
import pyDes
def toKey (string):
    b = string
    a = 0
    if len (b) > 16:
        while len (b) != 16:
            b = b [:-1]
    elif len (b) < 16:
        while len (b) != 16:
            b += b [a]
            a += 1
    return b
key = toKey (key)
data = pyDes.triple_des(key, pyDes.CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=pyDes.PAD_PKCS5)
print ("Before: " + text)
encrypted = str (data.encrypt (text)) [2:-1]
print ("Encrypted: " + encrypted)
decrypted = str (data.decrypt (encrypted)) [2:-1]
print ("Decrypted: " + decrypted)

当我运行程序时,加密工作正常,但是,解密会引发错误:

Traceback (most recent call last):
  File "E:\Python\Examples\Encrypt.py", line 23, in <module>
    decrypted = str (data.decrypt (encrypted)) [2:-1]
  File "E:\Python\Libraries\pyDes\pyDes.py", line 836, in decrypt
    block = self.__key3.crypt(iv,    DECRYPT)
  File "E:\Python\Libraries\pyDes\pyDes.py", line 572, in crypt
    raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n.")
ValueError: Invalid data length, data must be a multiple of 8 bytes

很抱歉,如果这真的很烦人和简单: - (

1 个答案:

答案 0 :(得分:1)

问题似乎是您使用str(...)[2:-1]bytes值转换为字符串。

也许您在尝试以下代码后决定使用此代码

encrypted = data.encrypt (text)
print ("Encrypted: " + encrypted)

并发现它报告错误TypeError: Can't convert 'bytes' object to str implicitly

关于encryptdecrypt方法(以及输入)的输出,需要注意的一点是它们使用bytes个对象,而不是字符串({ {1}})。您正在做的是将str对象从调用bytes调回来,使用data.encrypt将其转换为字符串(这不是正确的方法) )然后尝试解密您的字符串,而不是从str返回的bytes值。

您需要做的是将{9}}对象的encrypt方法转换为bytes对象,然后再将其传递给{{1} }}。您需要指定一个字符集来执行此编码,例如encode。从str返回输出后,使用data.encrypt对象的utf-8方法将其转换回字符串。

然而,加密数据在任何字符集中都不可读。 (它很可能不是格式良好的UTF-8,所以不要尝试将其转换成它。)如果你想看看它的样子,也许最好的办法是使用内置的repr函数,但仅在打印值时使用它。

进行这些更改后,您的代码的最后几行是这样的:

decrypt

以下是样本运行的输出:

decode

加密数据中的bytes序列是Python如何在charset = "utf-8" encrypted = data.encrypt(text.encode(charset)) print ("Encrypted: " + repr(encrypted)) decrypted = data.decrypt(encrypted).decode(charset) print ("Decrypted: " + decrypted) 对象中显示不在ASCII范围内的单个字节。