2011-03-09 12 views
7

मैं .NET 3.5 का उपयोग करके बाइट की एक सरणी एन्क्रिप्ट/obfuscate (और निश्चित रूप से डिक्रिप्ट/deobfuscate) के लिए एक रास्ता तलाश रहा हूँ।.NET में किसी गुप्त का उपयोग करके बाइट सरणी को एन्क्रिप्ट/obfuscate करने का आसान तरीका?

असल:

byte[] aMixedUp = Encrypt(aMyByteData, "THIS IS THE SECRET KEY USED TO ENCRYPT"); 

और दूसरी तरफ:

byte[] aDecrypted = Decrypt(aMixedUp, "THIS IS THE SECRET KEY USED TO ENCRYPT"); 

यह बुलेट प्रूफ होने की जरूरत नहीं है। विचार यह है कि उपयोगकर्ताओं को एएससीआईआई के लिए मानचित्र पर बाइट्स में क्या दिख रहा है, इसे सीधे देखने से रोकने के लिए, लेकिन यह बेहतर होना चाहिए तो ROT13।

क्या .NET पुस्तकालयों में कुछ ऐसा है जो मैं आसानी से उपयोग कर सकता हूं?

+0

सबसे आसान तरीका मैं पाया है [मेरे सवाल यहां] (http://stackoverflow.com/questions/11762/c-cryptographicexception-padding-is-invalid-and-cannot-be-removed) – Blorgbeard

+0

में है तो आधार रूपांतरण सवाल से बाहर है? आइए बेस 64 या यहां तक ​​कि बेस 2 में कनवर्ट करना कहें? मुझे लगता है कि आरओटी 13 से बेहतर है! – Ali

+1

@ ब्लॉगरबीर्ड: ऐसा क्यों न करें, मैं आपको क्रेडिट दूंगा! यही वही है जो मैं लोकिंग कर रहा हूं! – Krumelur

उत्तर

7

यहां कुछ कोड है जिसे मैंने स्ट्रिंग को एन्क्रिप्ट/डिक्रिप्ट करने के लिए लिखा है। एन्क्रिप्टेड स्ट्रिंग बेस 64 को एनालोडेड के लिए सीरियलाइजेशन की आसानी के लिए एन्कोड किया गया है। आप आसानी से स्ट्रिंग के बजाए बाइट एरे के साथ काम करने के लिए इस कोड को आसानी से परिवर्तित कर सकते हैं।

/// <summary> 
/// Create and initialize a crypto algorithm. 
/// </summary> 
/// <param name="password">The password.</param> 
private static SymmetricAlgorithm GetAlgorithm(string password) 
{ 
    var algorithm = Rijndael.Create(); 
    var rdb = new Rfc2898DeriveBytes(password, new byte[] { 
     0x53,0x6f,0x64,0x69,0x75,0x6d,0x20,    // salty goodness 
     0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65 
    }); 
    algorithm.Padding = PaddingMode.ISO10126; 
    algorithm.Key = rdb.GetBytes(32); 
    algorithm.IV = rdb.GetBytes(16); 
    return algorithm; 
} 


/// <summary> 
/// Encrypts a string with a given password. 
/// </summary> 
/// <param name="clearText">The clear text.</param> 
/// <param name="password">The password.</param> 
public static string EncryptString(string clearText, string password) 
{ 
    var algorithm = GetAlgorithm(password); 
    var encryptor = algorithm.CreateEncryptor(); 
    var clearBytes = Encoding.Unicode.GetBytes(clearText); 
    using (var ms = new MemoryStream()) 
    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
    { 
     cs.Write(clearBytes, 0, clearBytes.Length); 
     cs.Close(); 
     return Convert.ToBase64String(ms.ToArray()); 
    } 
} 

/// <summary> 
/// Decrypts a string using a given password. 
/// </summary> 
/// <param name="cipherText">The cipher text.</param> 
/// <param name="password">The password.</param> 
public static string DecryptString(string cipherText, string password) 
{ 
    var algorithm = GetAlgorithm(password); 
    var decryptor = algorithm.CreateDecryptor(); 
    var cipherBytes = Convert.FromBase64String(cipherText); 
    using (var ms = new MemoryStream()) 
    using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) 
    { 
     cs.Write(cipherBytes, 0, cipherBytes.Length); 
     cs.Close(); 
     return Encoding.Unicode.GetString(ms.ToArray()); 
    } 
} 
+1

जैसा कि पहले से ही कहा गया है: यह मेरा पसंदीदा है! धन्यवाद! – Krumelur

3

Symmetric-key algorithm ऐसा करने का सबसे आसान तरीका होगा, आप उन्हें .NET ढांचे में पा सकते हैं।

लेकिन ध्यान रखें कि एक हैकर आपके ऐप को "आसान" कर सकता है और एन्क्रिप्शन कुंजी ढूंढ सकता है। आपके सेनारियो के आधार पर आप public/private कुंजी सिस्टम का उपयोग कर सकते हैं। आप कम से कम बाइट सरणी को एन्क्रिप्ट कर सकते हैं नियंत्रित कर सकते हैं।

4

निम्नलिखित कोड का एक नमूना है जो .NET फ्रेमवर्क से रिजेंडेल क्लास का उपयोग एन्क्रिप्ट और बाइट्स की सरणी को डिक्रिप्ट करने के लिए करता है; स्पष्ट रूप से इस वर्ग को प्रतिस्थापित किया जा सकता है जिसके लिए आपको सबसे अच्छा लगा।

आपको केवल कुंजी और IV गुणों को परिभाषित करने और उन्हें कहीं से प्राप्त करने की आवश्यकता होगी (उदाहरण के लिए एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल का एन्क्रिप्टेड अनुभाग)।

private static byte[] EncryptBytes(IEnumerable<byte> bytes) 
    { 
     //The ICryptoTransform is created for each call to this method as the MSDN documentation indicates that the public methods may not be thread-safe and so we cannot hold a static reference to an instance 
     using (var r = Rijndael.Create()) 
     { 
      using (var encryptor = r.CreateEncryptor(KEY, IV)) 
      { 
       return Transform(bytes, encryptor); 
      } 
     } 
    } 

    private static byte[] DecryptBytes(IEnumerable<byte> bytes) 
    { 
     //The ICryptoTransform is created for each call to this method as the MSDN documentation indicates that the public methods may not be thread-safe and so we cannot hold a static reference to an instance 
     using (var r = Rijndael.Create()) 
     { 
      using (var decryptor = r.CreateDecryptor(KEY, IV)) 
      { 
       return Transform(bytes, decryptor); 
      } 
     } 
    } 

    private static byte[] Transform(IEnumerable<byte> bytes, ICryptoTransform transform) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      using (var cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Write)) 
      { 
       foreach (var b in bytes) 
        cryptoStream.WriteByte(b); 
      } 

      return stream.ToArray(); 
     } 
    } 
0

आप एन्क्रिप्शन की जरूरत नहीं है, तो आप बस सब कुछ हेक्स या बेस 64 या उस तरह का कुछ करने के लिए परिवर्तित कर सकते हैं, प्रभावी रूप से यह यह असंभव जब तक कि कोई वास्तव में समर्पित है पढ़ने के लिए बना देंगे। Here is a link that shows how in .NET

+5

मुझे नहीं लगता कि डीकोडिंग हेक्स या बेस 64 मायने रखता है "वास्तव में समर्पित" .. – Blorgbeard

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

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