我现在开始道,我的编程习惯不是很好。我已经从他们的网站修改了基本的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
很抱歉,如果这真的很烦人和简单: - (
答案 0 :(得分:1)
问题似乎是您使用str(...)[2:-1]
将bytes
值转换为字符串。
也许您在尝试以下代码后决定使用此代码
encrypted = data.encrypt (text)
print ("Encrypted: " + encrypted)
并发现它报告错误TypeError: Can't convert 'bytes' object to str implicitly
。
关于encrypt
和decrypt
方法(以及输入)的输出,需要注意的一点是它们使用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范围内的单个字节。