۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از رمزگذاری متقارن و نامتقارن در سی شارپ

بیاموزید که چگونه با رمزگذاری و رمزگشایی داده ها با استفاده از یک کلید یا یک جفت کلید عمومی/خصوصی، از اطلاعاتی که توسط برنامه های دات نت مدیریت می شود محافظت کنید.

بیاموزید که چگونه با رمزگذاری و رمزگشایی داده ها با استفاده از یک کلید یا یک جفت کلید عمومی/خصوصی، از اطلاعاتی که توسط برنامه های دات نت مدیریت می شود محافظت کنید.

رمزگذاری داده‌ها را به فرمی تبدیل می‌کند که فقط توسط شخصی که کلیدی دارد که به او امکان رمزگشایی آن را می‌دهد قابل خواندن باشد. می‌توانید از رمزگذاری برای محافظت از داده‌ها در حالت استراحت (داده‌هایی که در یک ذخیره‌سازی داده‌ها قرار دارند) یا برای محافظت از داده‌های «در حال حرکت» (داده‌هایی که از طریق شبکه ارسال می‌شوند) استفاده کنید.

این مقاله بررسی خواهد کرد که چگونه می توانیم با دو نوع رمزگذاری در سی شارپ کار کنیم، رمزگذاری متقارن و رمزگذاری نامتقارن. رمزگذاری متقارن از یک کلید برای رمزگذاری و رمزگشایی استفاده می کند. رمزگذاری نامتقارن از دو کلید مجزا برای رمزگذاری و رمزگشایی استفاده می‌کند.

برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید یک نسخه را از اینجا بارگیری کنید.

یک پروژه برنامه کاربردی کنسول NET Core در ویژوال استودیو ایجاد کنید

ابتدا، اجازه دهید یک پروژه برنامه کاربردی کنسول NET Core در Visual Studio 2022 ایجاد کنیم. با فرض اینکه Visual Studio 2022 در سیستم شما نصب شده است، مراحل زیر را برای ایجاد یک پروژه برنامه کاربردی کنسول NET Core جدید دنبال کنید.

  1. Visual Studio 2022 Preview IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “Console App (.NET Core)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود” که در ادامه نشان داده شده است، نام و مکان پروژه جدید را مشخص کنید.
  6. بعدی را کلیک کنید.
  7. در پنجره “اطلاعات اضافی”، .NET 7 را به عنوان نسخه NET مورد نظر برای استفاده مشخص کنید.
  8. روی ایجاد کلیک کنید.

این یک پروژه برنامه کاربردی کنسول NET 7 جدید در Visual Studio 2022 ایجاد می‌کند. ما از این پروژه برای کار با رمزگذاری در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

رمزگذاری متقارن در مقابل رمزگذاری نامتقارن

رمزگذاری دو نوع است: رمزگذاری متقارن و رمزگذاری نامتقارن. رمزگذاری متقارن و نامتقارن می تواند به محافظت از داده های حساس موجود در انبار داده یا در حال حمل و نقل شما کمک کند. سی شارپ پشتیبانی داخلی برای رمزگذاری متقارن و نامتقارن از طریق فضای نام System.Security.Cryptography فراهم می کند.

Wasmer WebAssembly، Posix را با مشخصات WASIX ترکیب می کند

در حالی که رمزگذاری متقارن فقط از یک کلید برای رمزگذاری و رمزگشایی داده ها استفاده می کند، رمزگذاری نامتقارن از دو کلید استفاده می کند: یک کلید عمومی که برای رمزگذاری داده ها استفاده می شود و یک کلید خصوصی که برای رمزگشایی داده ها استفاده می شود. رمزگذاری متقارن عموما سریعتر و کارآمدتر است، اما باید کلید را مخفی نگه دارید، زیرا هر کسی که به کلید دسترسی داشته باشد می تواند داده ها را رمزگشایی کند. رمزگذاری نامتقارن کندتر از رمزگذاری متقارن است، اما همچنین بسیار ایمن تر است زیرا کلید رمزگشایی مشترک نیست. فقط شخصی که کلید خصوصی را در اختیار دارد می‌تواند داده‌ها را رمزگشایی کند.

تفاوت بین رمزگذاری متقارن و نامتقارن آنها را برای موارد استفاده مختلف مناسب می کند، همانطور که مایکروسافت اشاره می کند اینجا در مستندات NET:

رمزگذاری متقارن و رمزگذاری نامتقارن با استفاده از فرآیندهای مختلف انجام می شود. رمزگذاری متقارن بر روی جریان ها انجام می شود و بنابراین برای رمزگذاری مقادیر زیادی از داده ها مفید است. رمزگذاری نامتقارن بر روی تعداد کمی بایت انجام می شود و بنابراین فقط برای مقادیر کمی داده مفید است.

این توضیح می دهد که چرا رمزگذاری متقارن اغلب برای محافظت از داده های ارسال شده از طریق شبکه (مانند ایمیل) استفاده می شود در حالی که رمزگذاری نامتقارن اغلب برای محافظت از داده های حساس مانند شماره های امنیت اجتماعی، رمزهای عبور و شماره کارت اعتباری استفاده می شود.

>

در بخش‌های بعدی، یک رشته را با استفاده از C# رمزگذاری و رمزگشایی می‌کنیم، ابتدا با رمزگذاری متقارن و سپس با رمزگذاری نامتقارن. ما از یک رشته به‌عنوان داده در مثال‌هایمان استفاده می‌کنیم تا همه چیز ساده باشد.

اجرای رمزگذاری متقارن در سی شارپ

برای اجرای رمزگذاری متقارن، باید یک کلید ۲۵۶ بیتی برای رمزگذاری و رمزگشایی داده ها ایجاد کنید. رمزگذاری متقارن سریعتر از رمزگذاری نامتقارن است اما امنیت کمتری دارد زیرا می توانید از همان کلید برای رمزگذاری و رمزگشایی داده ها استفاده کنید. گیرنده از همان راز مشترک برای رمزگشایی پیام پس از دریافت آن از فرستنده استفاده می کند. اگر کلید به طور ایمن به اشتراک گذاشته نمی شود، شخص ثالث می تواند از آن برای رمزگشایی و خواندن داده ها استفاده کند.

رفتار رشته در JVM

در پروژه برنامه کاربردی کنسولی که قبلا ایجاد کردید، یک کلاس C# ثابت به نام SymmetricEncryptionDecryptionManager در فایلی به نام SymmetricEncryptionDecryptionManager.cs ایجاد کنید و کد زیر را وارد کنید.

 
using System.Security.Cryptography;
using System.Text;
namespace EncryptionDemo
{
    public class SymmetricEncryptionDecryptionManager
    {
        public static string Encrypt(string data, string key)
        {
            byte[] initializationVector = Encoding.ASCII.GetBytes("abcede0123456789");
            using (Aes aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = initializationVector;
                var symmetricEncryptor = aes.CreateEncryptor(aes.Key, aes.IV);
                using (var memoryStream = new MemoryStream())
                {
                    using (var cryptoStream = new CryptoStream(memoryStream as Stream,
symmetricEncryptor, CryptoStreamMode.Write))
                    {
                        using (var streamWriter = new StreamWriter(cryptoStream as Stream))
                        {
                            streamWriter.Write(data);
                        }
                        return Convert.ToBase64String(memoryStream.ToArray());
                    }
                }
            }
        }
        public static string Decrypt(string cipherText, string key)
        {
            byte[] initializationVector = Encoding.ASCII.GetBytes("abcede0123456789");
            byte[] buffer = Convert.FromBase64String(cipherText);
            using (Aes aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = initializationVector;
                var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
                using (var memoryStream = new MemoryStream(buffer))
                {
                    using (var cryptoStream = new CryptoStream(memoryStream as Stream,
decryptor, CryptoStreamMode.Read))
                    {
                        using (var streamReader = new StreamReader(cryptoStream as Stream))
                        {
                            return streamReader.ReadToEnd();
                        }
                    }
                }
            }
        }
    }
}

در فهرست کدهای قبلی، توجه داشته باشید که دو روش وجود دارد، رمزگذاری و رمزگشایی. روش Encrypt داده ها را برای رمزگذاری و کلید مخفی را به عنوان پارامتر می پذیرد. از الگوریتم استاندارد رمزگذاری پیشرفته (AES) برای انجام رمزگذاری متقارن داده ها با استفاده از کلید مخفی استفاده می کند. داده های رمزگذاری شده در قالب یک رشته Base64 برگردانده می شوند.

روش رمزگشایی داده های رمزگذاری شده و کلید مخفی را به عنوان پارامتر می پذیرد. متن رمز را به یک آرایه بایت تبدیل می کند که برای رمزگشایی داده ها با استفاده از کلید مخفی استفاده می شود. داده های رمزگشایی شده به عنوان یک رشته برگردانده می شوند.

مقدمه ای بر الگوی طراحی قابل مشاهده

می‌توانید از قطعه کد زیر برای رمزگذاری و رمزگشایی داده‌ها با استفاده از روش‌های Encrypt و Decrypt کلاس SymmetricEncryptionDecryptionManager استفاده کنید.

 
var encryptedText = SymmetricEncryptionDecryptionManager.Encrypt("This is sample text.", key);
Console.WriteLine(encryptedText);
var decryptedText = SymmetricEncryptionDecryptionManager.Decrypt(encryptedText, key);
Console.WriteLine(decryptedText);

اجرای رمزگذاری نامتقارن در سی شارپ

در رمزگذاری نامتقارن، از دو کلید مختلف برای رمزگذاری و رمزگشایی داده ها استفاده می شود. کلید عمومی برای رمزگذاری و کلید خصوصی برای رمزگشایی استفاده می شود. برای اجرای رمزگذاری نامتقارن باید هم کلید عمومی و هم کلید خصوصی داشته باشید.

برای رمزگذاری داده ها با استفاده از رمزگذاری نامتقارن، ابتدا باید یک جفت کلید عمومی/خصوصی ایجاد کنید. می توانید این کار را با استفاده از الگوریتم RSA همانطور که در زیر نشان داده شده است انجام دهید.

 
var rsa = new RSACryptoServiceProvider();
string publicKeyXML = rsa.ToXmlString(false);
string privateKeyXML = rsa.ToXmlString(true);

زمانی که جفت کلید را ایجاد کردید، می توانید از کلید عمومی برای رمزگذاری داده ها استفاده کنید.

 
byte[] data = Encoding.UTF8.GetBytes("Hello world!");
byte[]encryptedData = rsa.Encrypt(data, false);

سپس، برای رمزگشایی داده ها، باید از کلید خصوصی استفاده کنید.

 
byte[] decryptedData = rsa.Decrypt(encryptedData, false);
string message = Encoding.UTF8.GetString(decryptedData);

اجازه دهید یک کلاس جدید به نام AsymmetricEncryptionDecryptionManager با کد زیر ایجاد کنیم.

 
public class AsymmetricEncryptionDecryptionManager
{
  public static string Encrypt(string data, RSAParameters rsaParameters)
  {
    using(var rsaCryptoServiceProvider = new RSACryptoServiceProvider())
    {
      rsaCryptoServiceProvider.ImportParameters(rsaParameters);
      var byteData = Encoding.UTF8.GetBytes(data);
      var encryptedData = rsaCryptoServiceProvider.Encrypt(byteData, false);
      return Convert.ToBase64String(encryptedData);
    }
  }
  public static string Decrypt(string cipherText, RSAParameters rsaParameters)
  {
    using(var rsaCryptoServiceProvider = new RSACryptoServiceProvider())
    {
      var cipherDataAsByte = Convert.FromBase64String(cipherText);
      rsaCryptoServiceProvider.ImportParameters(rsaParameters);
      var encryptedData = rsaCryptoServiceProvider.Decrypt(cipherDataAsByte, false);
      return Encoding.UTF8.GetString(encryptedData);
    }
  }
}

می‌توانید از قطعه کد زیر برای رمزگذاری و رمزگشایی داده‌ها با استفاده از روش‌های Encrypt and Decrypt کلاس AsymmetricEncryptionDecryptionManager استفاده کنید.

 
var rsaCryptoServiceProvider = new RSACryptoServiceProvider(2048);
var cipherText = AsymmetricEncryptionDecryptionManager.Encrypt("This is sample text.", rsaCryptoServiceProvider.ExportParameters(false));
Console.WriteLine(cipherText);
var plainText = AsymmetricEncryptionDecryptionManager.Decrypt(cipherText, rsaCryptoServiceProvider.ExportParameters(true));
Console.WriteLine(plainText);

شکل ۱ زیر خروجی را هنگام اجرای برنامه فوق نشان می دهد.

رمزگذاری نامتقارن متقارن

شکل ۱. نمایش رمزگذاری نامتقارن در NET.

توجه داشته باشید که می‌توانید SymmetricEncryptionDecryptionManager و AsymmetricEncryptionDecryptionManager را در یک کلاس ادغام کنید و روش‌های بارگذاری شده را برای رمزگذاری و رمزگشایی متقارن و نامتقارن بنویسید. می‌توانید از این دانش برای ایجاد برنامه‌های کاربردی یا وب‌سایت‌های ایمن استفاده کنید که از داده‌ها در برابر دسترسی غیرمجاز محافظت می‌کنند.