2013-10-18 4 views
5

मुझे वर्तमान में एक स्ट्रिंग एन्क्रिप्ट करने और सीई में एईएस-128 सममित एन्क्रिप्शन का उपयोग करके एक बाइट सरणी डिक्रिप्ट करने का एक तरीका चाहिए। मुझे ऐसा करने का कोई तरीका नहीं मिल रहा है, लेकिन शायद मुझे कुछ याद आया है।एवीएस 128 के बिना एवी 128 का उपयोग करके मैं एन्क्रिप्ट और डिक्रिप्ट कैसे कर सकता हूं?

+2

तुम क्यों IVs से बचने के लिए चाहते हैं? वे एक महत्वपूर्ण सुरक्षा सुविधा हैं। – CodesInChaos

+0

@CodesInChaos टिप्पणी पर विस्तार करने के लिए। चतुर्थों को यादृच्छिक रूप से जेनरेट किया जा सकता है और सिफरटेक्स्ट के साथ स्पष्ट रूप से प्रेषित किया जा सकता है। सुरक्षा के लिए चौथाई की गोपनीयता आवश्यक नहीं है। एक चतुर्थ के लिए आवश्यकताओं यह है कि आप एक ही कुंजी और चतुर्थ संयोजन का पुन: उपयोग नहीं करते हैं और चौथाई भविष्यवाणी करना कठिन होता है। – Dev

+0

यह प्रश्न एक प्रोजेक्ट के लिए था जहां किसी को IV के बिना एईएस का उपयोग करके एन्क्रिप्ट करने में दिलचस्पी थी। मैं सहमत हूं कि वे एक महत्वपूर्ण सुरक्षा सुविधा हैं हालांकि! – kdh

उत्तर

11

आयात नामस्थान

using System; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography; 

    static void Main(string[] args) 
     { 
      string value = "@arifansari300<3>"; 

      string encryptedValue= EncryptDecrypt.Encrypt(value); 

      string decryptedValue = EncryptDecrypt.Decrypt(encryptedValue); 
     } 

    public static string Encrypt(string clearText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(clearBytes, 0, clearBytes.Length); 
        cs.Close(); 
       } 
       clearText = Convert.ToBase64String(ms.ToArray()); 
      } 
     } 
     return clearText; 
    } 

    public static string Decrypt(string cipherText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] cipherBytes = Convert.FromBase64String(cipherText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(cipherBytes, 0, cipherBytes.Length); 
        cs.Close(); 
       } 
       cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
      } 
     } 
     return cipherText; 
    } 
+1

'Rfc2898DeriveBytes' केवल एक अच्छा विकल्प है जब आपको उचित कुंजी उत्पन्न करने के बजाय अंतिम उपयोगकर्ता द्वारा दर्ज पासवर्ड का उपयोग करना होता है। लेकिन उस स्थिति में आपको नमक का उपयोग करना चाहिए (आपके उदाहरण में यह स्थिर है, जो चतुर्थ बिंदु को याद करता है) और अधिक पुनरावृत्तियों (कम से कम 20k, अधिमानतः अधिक)। यदि आपके पास उचित कुंजी है, तो सामान्य एन्क्रिप्शन सरल और * बहुत तेज़ है। – CodesInChaos

+0

मैं इस फ़ंक्शन PHP को कैसे परिवर्तित कर सकता हूं? – user3581428

+0

@CodesInChaos "सामान्य एन्क्रिप्शन" से आपका क्या मतलब है? –

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