2013-06-22 7 views
5

के साथ XORING फ़ाइल मैं बस एक बहु-बाइट कुंजी वाली फ़ाइल को XOR करने का प्रयास कर रहा हूं। कुंजी लंबाई में भिन्न हो सकती है। निम्न त्रुटि लौट रहा है:बहु-बाइट कुंजी

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 ... हैं बाइट्स की सरणी ... नहीं चार

आप बाइट पर 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 

नहीं बहुत pythonic ... मैं शायद बेहतर कर सकते थे। लेकिन कम से कम काम करने लगता है।


संपादित करें: के रूप में टिप्पणी में बताया गया है, यह बाइट्स और यूनिकोड वर्ण मिश्रण करने नहीं एक अच्छा विचार है।

जैसा कि आप यहां बाइट्स के साथ काम कर रहे हैं, आपकी कुंजी भी बाइट्स होनी चाहिए। कोड को साइड इफेट के रूप में सरल बनाना:

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

जबकि यह काम करता है, मुझे नहीं लगता कि यह एक अच्छा विचार है। आपको इस तरह से 'बाइट्स' और 'str' मिश्रण नहीं करना चाहिए! आप यूनिकोड कोडपॉइंट्स के साथ बाइट्स को एक्सपोर्ट कर रहे हैं और यूनिकोड को पुनर्प्राप्त कर रहे हैं, जो समझ में नहीं आता है। आम तौर पर 'xor (xor (ए, बी), बी) 'लगातार' होना चाहिए ''। डेटा और कुंजी दोनों बाइट्स और बाइट्स लौटने के लिए बेहतर होगा। – mata

+0

@mata आप सही हैं। "कुंजी" बाइट भी होना चाहिए था। मुझे नहीं पता कि यह ओपी बदल सकता है हालांकि ... –