2013-06-22 13 views
5

Po prostu próbuję XOR pliku z kluczem wielobajtowym. Klucz może mieć różną długość. Wracając do następującego błędu:XORing plik z kluczem wielobajtowym

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

Oto, nad czym teraz pracuję.

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 

Wiem, że brakuje mi czegoś prostego, ale nie mogę go umieścić.

+0

Czy możesz podać przypadek testowy (plik wejściowy + oczekiwany plik wyjściowy) - do testowania naszych odpowiedzi. –

Odpowiedz

4

bytearray są ... tablica bajtów ... nie char. Nie można użyć ord() na bajcie. To nie ma znaczenia.

spróbować zamiast:

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 

Niezbyt pythonowy ... pewnie mógłby zrobić lepiej. Ale wydaje się działać przynajmniej.


EDIT: Jak wyjaśniono w komentarzach, to nie dobry pomysł, aby mieszać bajtów i znaków Unicode.

Podczas pracy z tutaj bajtami klucz powinien również być bajtami. Upraszczanie kodu jako działania pobocznego:

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

oba działają świetnie, dzięki. Po drugie jest lepiej :) –

+1

podczas gdy to działa, nie sądzę, że to dobry pomysł. Nie powinieneś mieszać w ten sposób 'bytes' i' str'! Zużywasz bajty z kodami-kodami Unicode i odzyskujesz Unicode, co nie ma sensu. Zwykle 'xor (xor (a, b), b)' powinien zwracać 'a', aby był spójny. Byłoby lepiej, aby dane i klucze były zarówno bajtami, jak i bajtami zwracanymi. – mata

+0

@mata Masz rację. "Klucz" też powinien być bajtami. Nie wiem, czy ten OP mógłby to zmienić ... –

Powiązane problemy