2013-06-22 26 views
5

我只是試圖用多字節密鑰異或文件。鑰匙的長度可能會有所不同。返回以下錯誤:使用多字節密鑰異或文件

TypeError: ord() expected string of length 1, but int found 

以下是我現在正在處理的內容。

def xor(data, key): 
    l = len(key) 

    decoded = "" 
    for i in range(0, len(data)): 
     decoded += chr(ord(data[i])^ord(key[i % l])) 
    return decoded 

data = bytearray(open('myfile.bin', 'rb').read()) 

key = '\x2a\x2b\x2c\x5e\x25\x44' 
a = xor(data, key) 
print a 

我知道我錯過了一些簡單但不能放置的東西。

+0

你能提供一個測試用例(輸入文件+預期的輸出文件) - 用於測試我們的答案。 –

回答

4

bytearray是...數組字節 ...不是char

您不能在一個字節上使用ord()。這沒有意義。

嘗試,而不是:

def xor(data, key): 
    l = len(key) 

    decoded = "" 
    for i in range(0, len(data)): 
      decoded += chr(data[i]^ord(key[i % l])) 


    return decoded 

不是很Python的...我可能做的更好。但似乎至少工作。


編輯:正如評論解釋,這是不是一個好主意,混合字節和Unicode字符。

由於您在這裏使用字節,您的密鑰應該也是字節。簡化代碼作爲一個側面效果:

def xor(data, key): 
    l = len(key) 
    return bytearray((
     (data[i]^key[i % l]) for i in range(0,len(data)) 
    )) 


data = bytearray(open('myfile.bin', 'rb').read()) 

key = bytearray([0x2a,0x2b,0x2c,0x5e,0x25,0x44]) 
+0

都很好,謝謝。其次是更好的壽:) –

+1

雖然這個作品,我不認爲這是一個好主意。你不應該這樣混合使用'bytes'和'str'!你使用unicode codepoints對字節進行xoring,並且使用unicode,這是沒有意義的。通常'xor(xor(a,b),b)'應該返回'a'以保持一致。數據和密鑰最好是字節和返回字節。 – mata

+0

@mata你是對的。 「密鑰」也應該是字節。我不知道這個OP是否可以改變,雖然... –

相關問題