2013-06-22 21 views
5

Sadece XOR'a bir baytlık tuşa sahip bir dosya deniyorum. Anahtar uzunluk olarak değişebilir. Aşağıdaki hatayı döndürme:XORing dosyası çok baytlı tuşla

Şu an üzerinde çalışıyorum.

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 

Basit bir şey eksik olduğumu biliyorum, ancak yerleştiremiyorum.

+0

Bir test durumu (girdi dosyası + beklenen çıktı dosyası) verebilir misiniz - cevaplarımızı test etmek için. –

cevap

4

bytearray ... Hangi bayt dizisi ... değil karakter.

Bir baytta ord() kullanamazsınız. Bunun bir anlamı yok.

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 

çok Pythonictir Değil ... Ben muhtemelen daha iyi yapmış olabilir: yerine

deneyin. Ama en azından işe yarayacak gibi görünüyor.


DÜZENLEME: gibi yorumlarla açıklandığı, bu bayt ve Unicode karakterleri karıştırmak değil iyi bir fikirdir.

Burada baytlarla çalıştığınız için, anahtarınız da bayt olmalıdır. Bir yan etki olarak kodun basitleştirilmesi:

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

her ikisi de harika çalışıyor. İkincisi, bu işe yararken daha iyi olur :) –

+1

, bunun iyi bir fikir olduğunu sanmıyorum. Bu şekilde bayt ve 'str' karıştırmamalısınız! Unicode kod noktalarına sahip ve unicode'u geri çeken xoring bayt'ısınız, bu hiç mantıklı değil. Genellikle xor (xor (a, b), b) 'a'nın tutarlı olmasını sağlamalıdır. Veriler ve anahtarın hem bayt hem de dönüş baytı olması daha iyi olur. – mata

+0

@mata Haklısınız. "Anahtar" da bayt olmalıydı. Bu OP değişebilir mi bilmiyorum ama ... –

İlgili konular