2012-12-16 28 views
20

मैं इस मामले में एईएस में एक सममित एन्क्रिप्शन एल्गोरिदम का उपयोग करके डेटा एन्क्रिप्ट और डिक्रिप्ट करते समय इनिटिलाइजेशन वेक्टर और नमक (जब लागू हो) को संभालने और प्रबंधित करने का तरीका समझने की कोशिश कर रहा हूं।सममित एन्क्रिप्शन (एईएस): एन्क्रिप्टेड डेटा के साथ चतुर्थ और नमक को सुरक्षित और उचित से बचा रहा है?

मैंने विभिन्न एसओ धागे और विभिन्न अन्य वेबसाइटों से कटौती की है कि न तो चतुर्थ या नमक को गुप्त होना चाहिए, क्रूरतावादी हमलों जैसे क्रूरतावादी हमलों के खिलाफ बचाव के लिए केवल अद्वितीय। इस बात को ध्यान में रखते हुए मुझे लगा कि यह मेरे छद्म यादृच्छिक चतुर्थ को एन्क्रिप्टेड डेटा के साथ स्टोर करने के लिए व्यवहार्य होगा। मैं पूछ रहा हूं कि जिस विधि का मैं उपयोग कर रहा हूं वह उचित है और इसके अलावा, क्या मुझे अपने वर्तमान में हार्ड कोडित नमक का इलाज उसी तरीके से करना चाहिए? यही कारण है कि स्मृति स्ट्रीम पर लेखन किया जा रहा है ओर के साथ चतुर्थ

मेरे कोड:

private const ushort ITERATIONS = 300; 
private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c }; 

private static byte[] CreateKey(string password, int keySize) 
{ 
    DeriveBytes derivedKey = new Rfc2898DeriveBytes(password, SALT, ITERATIONS); 
    return derivedKey.GetBytes(keySize >> 3); 
} 

public static byte[] Encrypt(byte[] data, string password) 
{ 
    byte[] encryptedData = null; 
    using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider()) 
    { 
     provider.GenerateIV(); 
     provider.Key = CreateKey(password, provider.KeySize); 
     provider.Mode = CipherMode.CBC; 
     provider.Padding = PaddingMode.PKCS7; 

     using (MemoryStream memStream = new MemoryStream(data.Length)) 
     { 
      memStream.Write(provider.IV, 0, 16); 
      using (ICryptoTransform encryptor = provider.CreateEncryptor(provider.Key, provider.IV)) 
      { 
       using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write)) 
       { 
        cryptoStream.Write(data, 0, data.Length); 
        cryptoStream.FlushFinalBlock(); 
       } 
      } 
      encryptedData = memStream.ToArray(); 
     } 
    } 
    return encryptedData; 
} 

public static byte[] Decrypt(byte[] data, string password) 
{ 
    byte[] decryptedData = new byte[data.Length]; 
    using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider()) 
    { 
     provider.Key = CreateKey(password, provider.KeySize); 
     provider.Mode = CipherMode.CBC; 
     provider.Padding = PaddingMode.PKCS7; 
     using (MemoryStream memStream = new MemoryStream(data)) 
     { 
      byte[] iv = new byte[16]; 
      memStream.Read(iv, 0, 16); 
      using (ICryptoTransform decryptor = provider.CreateDecryptor(provider.Key, iv)) 
      { 
       using (CryptoStream cryptoStream = new CryptoStream(memStream, decryptor, CryptoStreamMode.Read)) 
       { 
        cryptoStream.Read(decryptedData, 0, decryptedData.Length); 
       } 
      } 
     } 
    } 
    return decryptedData; 
} 

मैं भी उचित व्यवहार के संबंध में सममित एन्क्रिप्शन के बारे में किसी भी अन्य जानकारी के लिए खुला रहा हूँ।

+0

यदि आप उन्हें अपने एन्क्रिप्टेड डेटा के साथ संग्रहीत नहीं कर रहे हैं, तो आपको उन्हें कहीं भी स्टोर करना होगा - इसलिए वाईएमएमवी। – larsw

+4

सीबीसी मोड में, प्रत्येक एन्क्रिप्टेड ब्लॉक अगले ब्लॉक के चौथाई के रूप में कार्य करता है, इसलिए चतुर्थ सार्वजनिक मूल्य होने से सुरक्षा प्रासंगिक नहीं हो सकती है - अन्यथा ऑपरेशन के सीबीसी मोड सुरक्षित नहीं होंगे। :) – vhallac

+0

@ vhallac अच्छी तरह से, वी (वेक्टर) जितना अधिक IV (प्रारंभिक वेक्टर) के रूप में स्पष्ट रूप से केवल पहला हो सकता है। –

उत्तर

23

सिफर टेक्स्ट के साथ लंबे समय तक चतुर्थ और नमक भंडारण उचित और सर्वोत्तम अभ्यास है। नमक को कड़ी मेहनत करना उपयोगी नहीं है, यादृच्छिक होना महत्वपूर्ण है, पुनरावृत्तियों को कड़ी कोडिंग पूरी तरह से ठीक है लेकिन आमतौर पर 300 से अधिक है (वास्तव में कम से कम 1000 और यदि आप अपनी मशीन/उपयोग इसे 10 के दशक में संभाल सकते हैं तो आप आमतौर पर बहुत अधिक हो जाते हैं हजारों)।

क्योंकि मैंने स्टैक ओवरफ्लो कट से सी # एन्क्रिप्शन के इतने सारे बुरे (या पुराने) उदाहरणों को देखा है और ओपन सोर्स कोड में पेस्ट किया है, मैंने थोड़ा सा कट और पेस्ट एन्क्रिप्शन कोड Modern Examples of Symmetric Authenticated Encryption of a string. लिखा है कि मैं इसे जारी रखने की कोशिश करता हूं तारीख और समीक्षा की। यह सिफरटेक्स्ट के साथ iv और नमक को स्टोर करता है, यह सिफर टेक्स्ट और सिफर टेक्स्ट के साथ मूल्यों को भी प्रमाणित करता है।

आदर्श रूप से एक बेहतर अभ्यास एक उच्च स्तरीय एन्क्रिप्शन लाइब्रेरी का उपयोग करना होगा जो आपके लिए iv जैसे सर्वोत्तम प्रथाओं को संभालेगा, हालांकि वे आमतौर पर csharp के लिए मौजूद नहीं हैं। मैं Google के keyczar लाइब्रेरी के मूल csharp version पर काम कर रहा हूं। हालांकि यह उपयोग के लिए कार्यात्मक रूप से तैयार है, मैं पहले आधिकारिक स्थिर रिलीज से पहले कोड पर अधिक आंखें प्राप्त करना चाहता हूं।

13

हां, चतुर्थ और नमक दोनों सार्वजनिक मूल्य हैं। यह सुनिश्चित करना अधिक महत्वपूर्ण है कि ये प्रत्येक एन्क्रिप्शन ऑपरेशन के लिए यादृच्छिक मान हैं।

जंगली में इसका उदाहरण देने के लिए, rncryptor data format पर एक नज़र डालें। यहां नमक और चतुर्थ को सिफरटेक्स्ट और मैक मान के साथ डेटा प्रारूप में पैक किया जाता है। (नोट: यह एक उद्देश्य-सी उदाहरण है)।