2013-02-20 29 views
6

में एक्सओआर-आईएनजी स्ट्रिंग्स ने हाल ही में सी # के साथ खेलना शुरू किया, और मैं समझने की कोशिश कर रहा हूं कि निम्नलिखित कोड संकलित क्यों नहीं होता है। त्रुटि टिप्पणी के साथ लाइन पर, मुझे मिलता है:सी #

अंतर्निहित रूप से 'int' को 'char' में परिवर्तित नहीं कर सकता। एक स्पष्ट रूपांतरण बाहर निकलता है (यदि आप एक डाली याद कर रहे हैं?)

मैं दो तार के साथ एक सरल XOR आपरेशन करने के लिए कोशिश कर रहा हूँ।

public string calcXor (string a, string b) 
{ 
    char[] charAArray = a.ToCharArray(); 
    char[] charBArray = b.ToCharArray(); 
    char[] result = new char[6]; 
    int len = 0; 

    // Set length to be the length of the shorter string 
    if (a.Length > b.Length) 
     len = b.Length - 1; 
    else 
     len = a.Length - 1; 

    for (int i = 0; i < len; i++) { 
     result[i] = charAArray[i]^charBArray[i]; // Error here 
    } 

    return new string (result); 
} 
+2

यदि आपकी स्ट्रिंग ASCII है, तो इसे 'परिणाम [i] = (char) ((लघु) charAArray [i]^(लघु) charBArray [i]); ' – ebattulga

+3

बिटवाई ऑपरेटरों केवल ऑपरेटरों के रूप में संख्याएं लेते हैं। क्या आपकी स्ट्रिंग संख्यात्मक अंकों की श्रृंखला है? या आप एएससीआईआई मूल्यों के आधार पर इस ऑपरेशन को करने की कोशिश कर रहे हैं? – JohnFx

+1

धन्यवाद, मैं भूल गया कि xor bitwise ऑपरेटर है इसलिए यह 1 और 0 लेता है, यही वजह है कि यह int रूपांतरण के बारे में शिकायत करता है। –

उत्तर

4

आप 2 वर्णों पर xor कर रहे हैं। यह आपके लिए int पर एक अंतर्निहित प्रकार का रूपांतरण करेगा क्योंकि डेटा हानि नहीं है। हालांकि, int से char पर वापस परिवर्तित करने के लिए आपको एक स्पष्ट कलाकार प्रदान करने की आवश्यकता होगी।

आप स्पष्ट रूप से result[i] के लिए अपने int एक char में बदलने की जरूरत है:

result[i] = (char) (charAArray[i]^charBArray[i]); 
+0

मिल गया, धन्यवाद! कोड के लिए –

13

आप XOR-आईएनजी का उपयोग करते हैं डेटा को छिपाने के लिए, नीचे दिए गए कोड को देखो। जब तक आवश्यक हो कुंजी कुंजी दोहराया जाएगा। यह शायद एक छोटा/बेहतर दृष्टिकोण है:

public static string xorIt(string key, string input) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for(int i=0; i < input.Length; i++) 
     sb.Append((char)(input[i]^key[(i % key.Length)])); 
    String result = sb.ToString(); 

    return result; 
} 
+0

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

+0

मैं पूरी तरह से सहमत हूं। यदि आप एक सुरक्षित समाधान चाहते हैं तो उपकरण और ढांचे उपलब्ध हैं। वे आपके लिए उल्लिखित पीआरजी और अन्य सभी अच्छी घंटियाँ और सीटी के साथ सही तरीके से नौकरी करेंगे। –

+2

आईएमएचओ, एक्सओआर-आईएनजी स्ट्रिंग्स का बिंदु मजबूत सुरक्षा नहीं है, बल्कि 'obfuscation' में एक कदम है - यह आपके कोड को रिवर्स-इंजीनियरिंग करने के लिए और अधिक काम करता है यह समझने के लिए कि आपका ऐप कहां काम कर रहा है। विशेष रूप से, वे केवल आपके तारों को खोज नहीं सकते हैं। उन्हें तर्क का पता लगाना है, एक्सओआर विधि ढूंढना है, और उपयुक्त कुंजी के साथ उस विधि के माध्यम से सभी तारों को खिलाना है। – ToolmakerSteve

0

यदि परिणाम का मूल्य महत्वपूर्ण है तो एलन सही (स्वीकृत उत्तर) है। यदि आप सिर्फ एक मैच की तलाश में हैं और प्रदर्शन के बारे में चिंतित नहीं हैं, तो विकल्प के रूप में strcmp() या memcmp() का उपयोग करें।

असेंबलर में एक्सओआर द्वारा चीजों को शुरू करने के लिए आम बात है क्योंकि टी-चक्र कम हैं। अगर मैं ब्रूट-फोर्सिंग (हैश तुलना) था, तो यह strcmp या memcmp पर एक सुधार होगा क्योंकि मैं वास्तव में क्रमबद्ध नहीं करता हूं, बस मिलान/नामांकन करता हूं।

पाठकों को भी this से अवगत होना चाहिए जिसे tweaked किया जा सकता है।

+0

आईएमएचओ, यह उत्तर इस प्रश्न के लिए प्रासंगिक नहीं है, जो एक मैच की तलाश करने के बारे में कुछ भी नहीं कहता है। – ToolmakerSteve

+0

मैं इसका भुगतान करूंगा। मैंने कोड में बहुत कुछ पढ़ा। जब xor-ing स्ट्रिंग्स मैं आमतौर पर अग्रणी x'00 'के साथ छोटी स्ट्रिंग पैड करने की अपेक्षा करता हूं। एलएचएस के बजाय प्रगति ने मुझे विश्वास दिलाया कि एक मैच मांगा जा रहा है या अस्पष्ट डेटा में परिवर्तन हो रहा है। – mckenzm