2017-02-26 349 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範圍內的單個字節。

相關問題