2013-06-22 29 views
5

Tôi chỉ đang cố gắng XOR một tệp có khóa đa byte. Khóa có thể khác nhau về độ dài. Trả về lỗi sau:Tệp XORing có khóa nhiều byte

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

Đây là những gì tôi đang làm việc ngay bây giờ.

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 

Tôi biết tôi thiếu thứ gì đó đơn giản nhưng không thể đặt nó.

+0

Bạn có thể cung cấp một trường hợp thử nghiệm (tệp đầu vào + tệp đầu ra dự kiến) - để kiểm tra câu trả lời của chúng tôi. –

Trả lời

4

bytearray là ... mảng byte ... không char.

Bạn không thể sử dụng ord() trên một byte. Điều này không có ý nghĩa.

Hãy thử thay vì:

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 

Không rất Pythonic ... tôi có lẽ đã có thể làm tốt hơn. Nhưng dường như làm việc ít nhất.


EDIT: Như đã giải thích trong các ý kiến, đó là không một ý tưởng tốt để trộn byte và các ký tự unicode.

Khi bạn đang làm việc với byte ở đây, khóa của bạn cũng phải là byte. Đơn giản hóa mã như là một tác nhân phụ:

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

cả hai công việc tuyệt vời, cảm ơn. Thứ hai là tho tốt hơn :) –

+1

trong khi điều này hoạt động, tôi không nghĩ rằng đó là một ý tưởng tốt. Bạn không nên trộn 'byte' và' str' theo cách này! Bạn đang xoring byte với codepoints unicode và reticode un retode, điều đó không có ý nghĩa gì cả. Thông thường 'xor (xor (a, b), b)' sẽ trả về 'a' để nhất quán. Sẽ tốt hơn cho dữ liệu và khóa là cả byte và trả về byte. – mata

+0

@mata Bạn nói đúng. "Khóa" cũng phải là byte. Tôi không biết liệu OP này có thể thay đổi điều đó hay không ... –