2013-06-22 11 views
5

Sto semplicemente provando a XOR un file con una chiave multibyte. La chiave può variare in lunghezza. Tornando il seguente errore:File XORing con chiave multibyte

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

Ecco quello che sto lavorando con questo momento.

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 

So che mi manca qualcosa di semplice ma non riesco a posizionarlo.

+0

Potrebbe fornire un caso di test (file di input + file di output previsto) - per testare le nostre risposte. –

risposta

4

bytearray sono ... array di byte ... non char.

Non è possibile utilizzare ord() su un byte. Questo non ha significato.

Prova che, invece:

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 

Non molto Pythonic ... probabilmente ho potuto fare meglio. Ma sembra funzionare almeno.


EDIT: Come spiegato nei commenti, è non una buona idea di mescolare byte e caratteri Unicode.

Come si lavora con i byte qui, la chiave dovrebbe essere anche i byte. Semplificazione del codice come un lato effet:

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

funzionano entrambi alla grande, grazie. Secondo è meglio così :) –

+1

mentre funziona, non penso sia una buona idea. Non dovresti mischiare 'bytes' e' str' in questo modo! Stai tagliando byte con codepoint unicode e ritentando unicode, questo non ha senso. Solitamente 'xor (xor (a, b), b)' deve restituire 'a' per essere coerenti. Sarebbe meglio per i dati e la chiave essere entrambi i byte e restituire i byte. – mata

+0

@mata Hai ragione. La "chiave" avrebbe dovuto essere anche un byte. Non so se questo OP potrebbe cambiare quello sebbene ... –

Problemi correlati