2017-02-26 37 views
0

我现在很担心,我的编程习惯不太好。我从thier网站修改了基本pyDes代码:pyDes解密“数据必须是8字节的倍数”

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

如果不允许编码/解码问题,我们可以删除约30%关于密码学方面的问题,如果你问我。 –

回答

1

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

Perhap就是你在尝试下面的代码

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

,并发现它报告错误TypeError: Can't convert 'bytes' object to str implicitly后使用此解决。

有一点需要注意的encryptdecrypt方法的输出(和输入以及,对于这个问题)是,他们使用bytes对象,而不是字符串(str)。你正在做的是将bytes对象从呼叫返回到data.encrypt,使用str(这不是正确的方式来执行此操作)将其转换为字符串,然后试图解密您的字符串而不是您的值bytes值从encrypt回来。

你需要做什么,而不是被转换文本传递这data.encrypt之前被加密成bytes对象,使用strencode方法。您需要指定一个字符集来执行此编码,例如utf-8。一旦从decrypt得到输出,使用bytes对象的decode方法将其转换回字符串。

但是,加密数据不可能在任何字符集中可读。 (这很可能不是格式良好的UTF-8,所以不要试图将它转换成这种格式。)如果你想看看它的样子,或许最好的做法是使用内置的UTF-在repr函数中,但只有在打印该值时才使用。

做了这些改变之后,这里是你的代码的最后几行的样子:

charset = "utf-8" 
encrypted = data.encrypt(text.encode(charset)) 
print ("Encrypted: " + repr(encrypted)) 
decrypted = data.decrypt(encrypted).decode(charset) 
print ("Decrypted: " + decrypted) 

下面是一个示例运行的输出:

Text to be encrypted...example1234 
Key...5678 
Before: example1234 
Encrypted: b'\xf1\xed6cR9p\x18u\x1e\xf7\xcb\x98\xe40\xed' 
Decrypted: example1234 

加密数据中的\xNN序列是Python如何在bytes对象内显示不在ASCII范围内的单个字节。

相关问题