2010-03-28 10 views
9

मैं इस कोड C# में एक महत्वपूर्ण के साथ एक स्ट्रिंग एन्क्रिप्ट करने के लिए लिखा है:मुझे XOR एन्क्रिप्शन के साथ सहायता

private static int Bin2Dec(string num) 
{ 
    int _num = 0; 

    for (int i = 0; i < num.Length; i++) 
     _num += (int)Math.Pow(2, num.Length - i - 1) * int.Parse(num[i].ToString()); 

    return _num; 
} 

private static string Dec2Bin(int num) 
{ 
    if (num < 2) return num.ToString(); 

    return Dec2Bin(num/2) + (num % 2).ToString(); 
} 

public static string StrXor(string str, string key) 
{ 
    string _str = ""; 
    string _key = ""; 
    string _xorStr = ""; 
    string _temp = ""; 

    for (int i = 0; i < str.Length; i++) 
    { 
     _temp = Dec2Bin(str[i]);  

     for (int j = 0; j < 8 - _temp.Length + 1; j++) 
      _temp = '0' + _temp; 

     _str += _temp; 
    } 

    for (int i = 0; i < key.Length; i++) 
    { 
     _temp = Dec2Bin(key[i]); 

     for (int j = 0; j < 8 - _temp.Length + 1; j++) 
      _temp = '0' + _temp; 

     _key += _temp; 
    }  

    while (_key.Length < _str.Length) _key += _key; 

    if (_key.Length > _str.Length) _key = _key.Substring(0, _str.Length); 

    for (int i = 0; i < _str.Length; i++) 
     if (_str[i] == _key[i]) { _xorStr += '0'; } else { _xorStr += '1'; } 

    _str = ""; 

    for (int i = 0; i < _xorStr.Length; i += 8) 
    { 
     char _chr = (char)0; 
     _chr = (char)Bin2Dec(_xorStr.Substring(i, 8)); //ERROR : (Index and length must refer to a location within the string. Parameter name: length) 
     _str += _chr; 
    } 

    return _str; 
} 

समस्या यह है कि मैं हमेशा जब मैं इस कोड के साथ एक encryted पाठ डिक्रिप्ट करने के लिए चाहते हैं त्रुटि मिलती है:

string enc_text = ENCRYPT.XORENC("abc","a"); // enc_text = " ♥☻" 
string dec_text = ENCRYPT.XORENC(enc_text,"a"); // ArgumentOutOfRangeException 

कोई संकेत?

+1

सभी मैं कह सकता हूँ हाँ है के लिए कुछ सरल कोड है? :) शायद यह एक शैक्षणिक अभ्यास है लेकिन आपको पात्रों को तारों में बदलने की आवश्यकता नहीं है, उन्हें मैन्युअल रूप से एक्सर करें और फिर उन्हें एक स्ट्रिंग में परिवर्तित करें। जैसा कि आपके Dec2Bin और Bin2Dec फ़ंक्शंस को साबित किया गया है, को कोस्ट्स के साथ इनट्स में परिवर्तित किया जा सकता है, इसलिए केवल स्ट्रिंग्स से चार ले जाएं, '^' xor ऑपरेटर को लागू करें और नई स्ट्रिंग में डाल दें। – tyranid

+0

यदि आप निर्दिष्ट करते हैं कि आपको कौन सी त्रुटि मिल रही है तो यह मदद करेगा :) –

+0

इसके अलावा, आप स्ट्रिंग्स के बजाय स्ट्रिंगबिल्डर का उपयोग करना चाह सकते हैं। स्ट्रिंग्स अपरिवर्तनीय हैं (उन्हें बदला नहीं जा सकता है), इसलिए _str + = _temp जैसी चीज़ें; हर बार एक नई स्ट्रिंग उत्पन्न करता है, जो इस विधि को अनावश्यक रूप से भारी/महंगा बनाता है। एक स्ट्रिंगबिल्डर का उपयोग करें और .एपेंड (अस्थायी)। –

उत्तर

44

यदि आपके पास कोई चरित्र है, तो char, आप इसे एक पूर्णांक, int में परिवर्तित कर सकते हैं।

और फिर आप उस पर एक्सओआर करने के लिए ^ ऑपरेटर का उपयोग कर सकते हैं। आप फिलहाल उस ऑपरेटर का उपयोग नहीं कर रहे हैं, जो आपकी समस्या का स्रोत हो सकता है।

string EncryptOrDecrypt(string text, string key) 
{ 
    var result = new StringBuilder(); 

    for (int c = 0; c < text.Length; c++) 
     result.Append((char)((uint)text[c]^(uint)key[c % key.Length])); 

    return result.ToString(); 
} 

उस तरह की चीज। यहाँ कि चरणों में एक ही बात करता है टिप्पणी के साथ एक लंबे समय तक संस्करण है, यह आसान जानने के लिए से बनाने के लिए:

string EncryptOrDecrypt(string text, string key) 
{ 
    var result = new StringBuilder(); 

    for (int c = 0; c < text.Length; c++) 
    { 
     // take next character from string 
     char character = text[c]; 

     // cast to a uint 
     uint charCode = (uint)character; 

     // figure out which character to take from the key 
     int keyPosition = c % key.Length; // use modulo to "wrap round" 

     // take the key character 
     char keyChar = key[keyPosition]; 

     // cast it to a uint also 
     uint keyCode = (uint)keyChar; 

     // perform XOR on the two character codes 
     uint combinedCode = charCode^keyCode; 

     // cast back to a char 
     char combinedChar = (char)combinedCode; 

     // add to the result 
     result.Append(combineChar); 
    } 

    return result.ToString(); 
} 

लघु संस्करण ही निकाले गए मध्यवर्ती चर के साथ है, भाव, जहां वे कर रहे हैं में सीधे प्रतिस्थापन उपयोग किया गया।

1

यहाँ एन्क्रिप्ट और डिक्रिप्ट

class CEncryption 
{ 
    public static string Encrypt(string strIn, string strKey) 
    { 
     string sbOut = String.Empty; 
     for (int i = 0; i < strIn.Length; i++) 
     { 
      sbOut += String.Format("{0:00}", strIn[i]^strKey[i % strKey.Length]); 
     } 

     return sbOut; 
    } 

    public static string Decrypt(string strIn, string strKey) 
    { 
     string sbOut = String.Empty; 
     for (int i = 0; i < strIn.Length; i += 2) 
     { 
      byte code = Convert.ToByte(strIn.Substring(i, 2)); 
      sbOut += (char)(code^strKey[(i/2) % strKey.Length]); 
     } 

     return sbOut; 
    } 
} 
+1

डिक्रिप्ट फ़ंक्शन किसी पर विफल रहता है इसमें एक पूंजी पत्र के साथ स्ट्रिंग। इस समारोह के लिए कोई अद्यतन? – pithhelmet

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