Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyDes decrypt“数据必须是8字节的倍数”_Python_Python 3.x_Encryption - Fatal编程技术网

Python pyDes decrypt“数据必须是8字节的倍数”

Python pyDes decrypt“数据必须是8字节的倍数”,python,python-3.x,encryption,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):

我现在很抱歉,我的编程习惯不是很好。我已经修改了他们网站上的基本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

如果这真的很烦人且简单,那么很抱歉:-

问题似乎是您使用str..[2:-1]将字节值转换为字符串

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

encrypted = data.encrypt (text)
print ("Encrypted: " + encrypted)
并发现它报告了错误TypeError:无法将“bytes”对象隐式转换为str

关于encrypt和decrypt方法的输出以及输入,需要注意的一点是,它们使用的是bytes对象,而不是strings str。您要做的是获取调用data.encrypt返回的bytes对象,使用str将其转换为字符串(这不是正确的方法),然后尝试解密字符串,而不是加密返回的字节值

相反,您需要做的是使用str的encode方法将要加密的文本转换为bytes对象,然后再将其传递给data.encrypt。您需要指定一个字符集来进行这种编码,例如utf-8。一旦从decrypt获得输出,使用bytes对象的decode方法将其转换回字符串

然而,加密数据在任何字符集中都不太可能是可读的。它很可能不是格式良好的UTF-8,所以不要尝试将其转换为UTF-8。如果您想查看它的外观,也许最好使用内置函数,但仅在打印值时使用

进行这些更改后,下面是代码的最后几行:

charset = "utf-8"
encrypted = data.encrypt(text.encode(charset))
print ("Encrypted: " + repr(encrypted))
decrypted = data.decrypt(encrypted).decode(charset)
print ("Decrypted: " + decrypted)
以下是示例运行的输出:

要加密的文本…示例1234 5678号钥匙 之前:示例1234 加密:b'\xf1\xed6cR9p\x18u\x1e\xf7\xcb\x98\xe40\xed' 解密:示例1234
加密数据中的\xNN序列是Python在不在ASCII范围内的字节对象中显示单个字节的方式。

如果不允许编码/解码问题,如果您问我,我们可以删除关于加密的大约30%的问题。