2017-02-26 4 views
0

私は今、私のプログラミングの習慣はあまり良くありません。pyDes解読 "データは8バイトの倍数でなければなりません"

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 

申し訳ありませんが、これは本当に迷惑である場合:私はプログラムを実行すると、暗号化が正常に動作します

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) 

、しかし、復号化でエラーが発生します:私はthierウェブサイトから基本pyDesコードを変更しましたそしてシンプルな:-(

+0

エンコード/デコードの問題が許可されていない場合は、私に尋ねると、暗号に関する質問について約30%の削除が可能です。 –

答えて

1

問題は、文字列にbytes値を変換するためstr(...)[2:-1]の使用であるように思われる。

Perhap次のコード

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

をしようと、それは誤りTypeError: Can't convert 'bytes' object to str implicitlyを報告することを発見した後、これを使用して定住ね。 (だけでなく、そのことについてと入力)encryptdecryptメソッドの出力について注意する

ことの一つは、彼らがbytesオブジェクトではなく、文字列(str)を使用することです。あなたがしているのはdata.encryptへの呼び出しから返されたbytesオブジェクトで、str(これは正しい方法ではありません)を使用して文字列に変換してから、bytesの値ではなく文字列を復号しようとしていますencryptから返されました。あなたはdata.encryptにこれを渡す前に、あなたの代わりにやってする必要がどのような

は、strencode方法を使用して、bytesオブジェクトに暗号化されるテキストに変換されます。 utf-8のように、このエンコードを行うための文字セットを指定する必要があります。出力がdecryptから戻ったら、メソッドbytesオブジェクトを使用して文字列に変換し直します。

ただし、暗号化されたデータは、どのキャラクタセットでも読み込めない可能性があります。 (UTF-8がうまく構成されていない可能性が高いので、それをそれに変換しようとしないでください)。見た目を見たい場合は、おそらく、 repr機能では、値を印刷するときにのみ使用します。暗号化されたデータ内の

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

\xNN系列:

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

ここではサンプルの実行からの出力です:

は、これらの変更を行った後、ここにあなたのコードの最後の数行がどのように見えるかですPythonがASCII範囲にないbytesオブジェクト内の個々のバイトを表示する方法です。

関連する問題