2013-07-01 10 views
9

मैं यहां कुछ दिनों के लिए यहां समान प्रश्न पोस्ट कर रहा हूं, लेकिन ऐसा लगता है कि मैं सही चीज़ नहीं पूछ रहा था, इसलिए मुझे क्षमा करें यदि मैंने आपके एक्सओआर प्रश्नों से आपको थका दिया है: डी।एक्सओआर दो हेक्स तारों को कैसे करें ताकि प्रत्येक बाइट अलग से एक्सओआरड किया जा सके?

बिंदु पर - मेरे पास दो हेक्स स्ट्रिंग हैं और मैं इन स्ट्रिंग्स को एक्सओआर करना चाहता हूं जैसे कि प्रत्येक बाइट अलग से एक्सओआरड होता है (यानी संख्याओं की प्रत्येक जोड़ी अलग से एक्सओआरड होती है)। और मैं इसे अजगर में करना चाहता हूं, और मैं अलग-अलग लंबाई के तारों को प्राप्त करने में सक्षम होना चाहता हूं। मैं मैन्युअल रूप से मेरी बात को वर्णन करने के लिए एक उदाहरण क्या करेंगे (क्योंकि यह मुझे रिक्त स्थान में डाल देता है जहां मैं उन्हें होना चाहता हूँ मैं कोड वातावरण में इस्तेमाल किया):

Input: 
s1 = "48656c6c6f" 
s2 = "61736b" 

Encoding in binary: 
48 65 6c 6c 6f = 01001000 01100101 01101100 01101100 01101111 
61 73 6b  = 01100001 01110011 01101011 

XORing the strings: 
01001000 01100101 01101100 01101100 01101111 
        01100001 01110011 01101011 
        00001101 00011111 00000100 

Converting the result to hex: 
00001101 00011111 00000100 = 0d 1f 04 

Output: 
0d1f04 

तो, संक्षेप में प्रस्तुत करने, मैं करने के लिए सक्षम होना चाहते हैं इनपुट दो हेक्स स्ट्रिंग्स (ये आमतौर पर एएससीआईआई अक्षरों को हेक्स में एन्कोड किया जाएगा) अलग-अलग या बराबर लंबाई के होते हैं, और उनके एक्सओआर को प्राप्त करते हैं जैसे प्रत्येक बाइट अलग से एक्सओआरड होता है।

+1

क्यों 's2' कुंजी चक्र नहीं है और इसे' s1' के * सभी * अक्षरों पर लागू क्यों करें? इसे केवल अंतिम 3 पर क्यों लागू करें? –

उत्तर

11

उपयोग binascii.unhexlify() कि, binascii.hexlify() के साथ वापस हेक्स के लिए जा रहा बाइनरी डेटा, तो XOR करने के लिए अपने हेक्स तार चालू करने के लिए:

>>> from binascii import unhexlify, hexlify 
>>> s1 = "48656c6c6f" 
>>> s2 = "61736b" 
>>> hexlify(''.join(chr(ord(c1)^ord(c2)) for c1, c2 in zip(unhexlify(s1[-len(s2):]), unhexlify(s2)))) 
'0d1f04' 

वास्तविक XOR डीकोड डेटा की बाइट प्रति लागू किया जाता है (ord() और chr() उपयोग करने के लिए पूर्णांक से और पर जाएं)।

ध्यान दें कि आपके उदाहरण में, मैंने s1 को s2 (s1 की शुरुआत से वर्णों को अनदेखा करने के लिए) को छोटा कर दिया है। आप एक छोटी कुंजी s2 साथ s1 के सभी सांकेतिक शब्दों में बदलना कर सकते हैं बाइट्स साइकिल द्वारा:

>>> from itertools import cycle 
>>> hexlify(''.join(chr(ord(c1)^ord(c2)) for c1, c2 in zip(unhexlify(s1), cycle(unhexlify(s2))))) 
'2916070d1c' 

आप unhexlify() उपयोग करने के लिए नहीं है, लेकिन यह s1 2 से अधिक और s2 पात्रों पाशन की तुलना में बहुत आसान है एक समय में और XOR संचालन के लिए पूर्णांक मानों में बदलने के लिए int(twocharacters, 16) का उपयोग करना।

उपरोक्त का पायथन 3 संस्करण थोड़ा हल्का है; str.join() के बजाय bytes() का उपयोग करें और आप chr() और ord() कॉल ड्रॉप कर सकते हैं के रूप में आप सीधे पूर्णांक से अधिक पुनरावृति करने के लिए मिल:

>>> from binascii import unhexlify, hexlify 
>>> s1 = "48656c6c6f" 
>>> s2 = "61736b" 
>>> hexlify(bytes(c1^c2 for c1, c2 in zip(unhexlify(s1[-len(s2):]), unhexlify(s2)))) 
b'0d1f04' 
>>> from itertools import cycle 
>>> hexlify(bytes(c1^c2 for c1, c2 in zip(unhexlify(s1), cycle(unhexlify(s2))))) 
b'2916070d1c' 
+1

आपके उत्तर के लिए धन्यवाद! जो मुझे समझ में नहीं आता है, यह हिस्सा है: सी 1 के लिए, सी 2 में सी 2, सीएच 2 (अनहेक्सलिफ़ाई (एस 1), चक्र (अनहेक्सलिफ़ाई (एस 2))) बात यह है कि, मैं पाइथन के लिए नया हूं और आसानी से उलझन में हूं ।मुझे लगता है कि ज़िप फ़ंक्शन में सरणी के साथ कुछ करना है, लेकिन मुझे नहीं पता कि वे पाइथन में कैसे काम करते हैं। इसके अलावा, मैंने सोचा कि लूप के लिए केवल एक काउंटर है, लेकिन यहां आपके पास दो-सी 1 और सी 2 है, जो मुझे भी भ्रमित करता है। –

+1

'ज़िप() 'एकाधिक इनपुट अनुक्रम लेता है, और उनके तत्व जोड़ता है। तो यह आपको '[(एस 1 [0], एस 2 [0]) का अनुक्रम देता है, (एस 1 [1], एस 2 [1]), ...] 'प्रत्येक इनपुट अनुक्रम से तत्वों को ले कर प्रत्येक टुपल के साथ वही सूचकांक –

+1

@NorsulRonsul: क्योंकि इस मामले में 'ज़िप()' में दो इनपुट सूचियां हैं, प्रत्येक आउटपुट तत्व दो मानों के साथ एक tuple है। 'फॉर लूप' को दो मानों में अनपॅक करता है (जैसे आप नियमित असाइनमेंट में अनपॅकिंग कर सकते हैं, 'foo, bar = (' स्पैम ',' अंडे ')' foo = 'spam'' और 'bar =' असाइन करते हैं अंडे '। –

1

मैं क्या आप वास्तव में के लिए खोज रहे हैं, लेकिन उम्मीद है कि यह आपके लिए उपयोगी हो के बारे में सुनिश्चित नहीं कर रहा हूँ ।

>>> def getstr(encoded): 
    return "".join([chr(int(i+k, 16))for (i,k) in zip(encoded[0::2], encoded[1::2])]) 

>>> getstr(s1) 
'Hello' 

>>> getstr(s2) 
'ask' 

दो सामान्य तार के साथ शुरू, आप अपने परिणामों कुछ इस तरह कर रही है पा सकते हैं:

def xor_str(a,b): 
    result = int(a, 16)^int(b, 16) # convert to integers and xor them 
    return '{:x}'.format(result)  # convert back to hexadecimal 

यह जब तक स्ट्रिंग XOR देगा:

>>> "".join(reversed(["%02X" % (ord(c1)^ord(c2)) for c1, c2 in zip(reversed(getstr(s1)),  reversed(getstr(s2)))])) 
'0D1F04' 
7

मैं एक बहुत ही सरल समाधान नहीं मिला विषय समाप्त होता है

+1

जब लोग बिल्टिन प्रारूप का उपयोग नहीं करते हैं तो यह हमेशा मुझे खराब करता है। 'वापसी प्रारूप (परिणाम, 'एक्स')'। – Veky

संबंधित मुद्दे

 संबंधित मुद्दे