मैं इस मामले में एईएस में एक सममित एन्क्रिप्शन एल्गोरिदम का उपयोग करके डेटा एन्क्रिप्ट और डिक्रिप्ट करते समय इनिटिलाइजेशन वेक्टर और नमक (जब लागू हो) को संभालने और प्रबंधित करने का तरीका समझने की कोशिश कर रहा हूं।सममित एन्क्रिप्शन (एईएस): एन्क्रिप्टेड डेटा के साथ चतुर्थ और नमक को सुरक्षित और उचित से बचा रहा है?
मैंने विभिन्न एसओ धागे और विभिन्न अन्य वेबसाइटों से कटौती की है कि न तो चतुर्थ या नमक को गुप्त होना चाहिए, क्रूरतावादी हमलों जैसे क्रूरतावादी हमलों के खिलाफ बचाव के लिए केवल अद्वितीय। इस बात को ध्यान में रखते हुए मुझे लगा कि यह मेरे छद्म यादृच्छिक चतुर्थ को एन्क्रिप्टेड डेटा के साथ स्टोर करने के लिए व्यवहार्य होगा। मैं पूछ रहा हूं कि जिस विधि का मैं उपयोग कर रहा हूं वह उचित है और इसके अलावा, क्या मुझे अपने वर्तमान में हार्ड कोडित नमक का इलाज उसी तरीके से करना चाहिए? यही कारण है कि स्मृति स्ट्रीम पर लेखन किया जा रहा है ओर के साथ चतुर्थ
मेरे कोड:
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;
}
मैं भी उचित व्यवहार के संबंध में सममित एन्क्रिप्शन के बारे में किसी भी अन्य जानकारी के लिए खुला रहा हूँ।
यदि आप उन्हें अपने एन्क्रिप्टेड डेटा के साथ संग्रहीत नहीं कर रहे हैं, तो आपको उन्हें कहीं भी स्टोर करना होगा - इसलिए वाईएमएमवी। – larsw
सीबीसी मोड में, प्रत्येक एन्क्रिप्टेड ब्लॉक अगले ब्लॉक के चौथाई के रूप में कार्य करता है, इसलिए चतुर्थ सार्वजनिक मूल्य होने से सुरक्षा प्रासंगिक नहीं हो सकती है - अन्यथा ऑपरेशन के सीबीसी मोड सुरक्षित नहीं होंगे। :) – vhallac
@ vhallac अच्छी तरह से, वी (वेक्टर) जितना अधिक IV (प्रारंभिक वेक्टर) के रूप में स्पष्ट रूप से केवल पहला हो सकता है। –