نحوه استفاده از Encryption و Decryption در ASP.Net

در این مقاله ، توضیحاتی در مورد encryption و decryption خواهیم داشت و درباره ی روش های این کار نیز توضیح مختصری را ارائه خواهیم داد . سپس با ارائه یک مثال ، و توضیح آن بصورت مرحله به مرحله روش های رمزگذاری و رمزگشایی را برای شما خواهیم گفت .

نحوه استفاده از Encryption و Decryption در ASP.Net

Encryption پردازشی است که طی آن یک داده متنی آشکار را به چیزی که random و بی معنی است ، تبدیل میکند . Decryption برعکس عمل Encryption است ، یعنی یک داده random و بی معنی را به یک داده متنی با معنی تبدیل می کند .  ما چه نیازی به استفاده از پردازش های Encryption/Decryption داریم ؟ در برنامه های Client-Server امنیت فاکتور خیلی مهمی میباشد . 

برای مثال ، زمانی که یک داده محرمانه همانند پسورد را بین Client و Server رد و بدل می کنیم ، ما باید به امنیت و حفاظت از داده مطمئن باشیم . 

با استفاده از این پردازش ، ما میتوانیم داده اصلی را مخفی کرده و یکسری داده بی مصرف و آشغال را نمایش دهیم . بر این اساس ، کمی امنیت برای داده خود میتوانیم ایجاد کنیم . برای این کار ما از تکنیک
encryption و decryption  استفاده می کنیم ، که این امر با استفاده از تکنیکی به نام Cryptography ، قابل انجام است .
Cryptography یک دانش درمورد نوشتن بصورت رمزی و کدگذاری شده است و این علم قدیمی و کهن می باشد.اولین مقاله ای که توسط Cryptography کدگذاری و نوشته شد،تقریبا بازمیگردد به تاریخ 1900قبل از میلاد مسیح . 
در هنگام برقراری ارتباط از هر رسانه غیر قابل اعتماد ، که شامل هر شبکه ای، به ویژه اینترنت میشود  ، Cryptography لازم و ضروری است .

در اینجا پنج تابع ابتدایی از Cryptography را داریم :

• 
Privacy/confidentiality : تضمین این امر که هیچکس غیر از شخص دریافت کننده مورد نظر ، توانایی خواندن پیام را ندارد . 
• 
Authentication روند اثبات هویت فرد
• Integrity : اطمینان گیرنده از این امر که  ، پیامی که دریافت کرده است به هیچ وجه تفاوتی با پیام اصلی  ندارد . 
• Non-repudiation : مکانیزمی برای اینکه بفهمیم که شخص فرستنده واقعا این پیام را فرستاده است . 
• Key exchange :  روشی که کلید رمزنگاری بین فرستنده و گیرنده به اشتراک گذاشته میشود .

در Cryptography ، ما با داده های unencrypted ، به عنوان یک متن با معنی (Plaintext) ،  شروع می کنیم . Plaintext با تبدیل به متن cipher رمزگذاری می شود . و برای رمزگشایی به یک Plaintext معمولی تبدیل می شود . 

رمزگذاری و رمزگشایی بر اساس نوع ترفند Cryptography است .

(C = Ek(P
(P = Dk(C

که در آن ، P = plaintext, C = cipher text,
E = the encryption method,
D = the decryption method, and 

k = the key می باشد .
 
حال ما ، یک مثال Windows Application را که از رمزگذاری و رمزگشایی استفاده کرده است ، نشان می دهیم . 

زمانی که ما یک Password را رمزنگاری می کنیم ، یک رمزگشایی شده هم دریافت خواهیم کرد . 

مرحله اول : visual studio را باز کنید .




مرحله دو : "New Project" > "Windows" >"Windows Forms Application" 

مرحله سوم : حال ، روی Solution Explorer کلیک کنید . 






مرحله چهارم : frmMain.cs شبیه زیر خواهد بود .






مرحله پنجم : حال ، کدهایی که در زیر داده شده است را در frmMain.cs قرار دهید . 
 

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Text;  
using System.Windows.Forms;  
using DataAccessBlock;  
using System.Security.Cryptography;  
using System.Configuration;  
using System.Data.SqlClient;  
using Microsoft.SqlServer.Management.Common;  
using Microsoft.SqlServer.Management.Smo;  
using System.IO;  
  
namespace EnCryptDecrypt  
{  
    public partial class frmMain : Form  
    {  
        #region Variables for Encryption / Decryption  
        private static string Key = "cs techno private ltd1.,";  
        private static string sIV = "cstechno";  
        private static Encryption.EncryptionAlgorithm EncryptionType = Encryption.EncryptionAlgorithm.TripleDes;  
        #endregion  
        public frmMain()  
        {  
            InitializeComponent();  
        }  
  
        private void btnEncrypt_Click(object sender, EventArgs e)  
        {  
            if (txtClearText.Text == "")  
            {  
                error.SetError(txtClearText, "Enter the text you want to encrypt");  
            }  
            else  
            {  
                error.Clear();  
                string sPlainText = txtClearText.Text.Trim();  
                string cipherText = Encrpyt(sPlainText);  
                txtCipherText.Text = cipherText;  
                btnDecrypt.Enabled = true;  
  
            }  
        }  
        public static string Encrpyt(string sPlainText)  
        {  
            try  
            {  
                return DataAccessBlock.DataAccess.Encrpyt(sPlainText, Key, sIV, EncryptionType);  
            }  
            catch (Exception ex)  
            {  
                throw new Exception("BusinessGroup :: Encrypt ::Error occured.", ex);  
            }  
        }  
        public static string Decrypt(string sCipherText)  
        {  
            try  
            {  
                return DataAccessBlock.DataAccess.Decrypt(sCipherText, Key, sIV, EncryptionType);  
            }  
            catch (Exception ex)  
            {  
             // throw new Exception("BusinessGroup :: Decrypt ::Error occured.", ex);  
                MessageBox.Show("not an encrypted value");  
                return "";  
            }  
        }  
  
        private void btnDecrypt_Click(object sender, EventArgs e)  
        {  
            //txtClearText.Enabled = false;  
            if (txtCipherText.Text == "")  
            {  
                error.SetError(txtCipherText, "Enter the text you want to encrypt");  
            }  
            else  
            {  
                  
                  
                lblPassword.Visible = true;  
                  
                string sCipherText = txtCipherText.Text.Trim();  
  
                string decryptedText = Decrypt(sCipherText);  
                txtClearText.Text = decryptedText;  
                  
            }  
        }  
  
            
        private void frmMain_Load(object sender, EventArgs e)  
        {  
            lblMsg.Visible = false;  
              
        }  
  
          
  
        private void btnDecrypt1_Click(object sender, EventArgs e)  
        {  
            if (txtConString.Text == "")  
            {  
                error.SetError(txtConString, "Enter the text you want to encrypt");  
            }  
            else  
            {  
                string connectionString = txtConString.Text;  
                DataTable tables = new DataTable("Tables");  
                using (SqlConnection connection = new SqlConnection(connectionString))  
                {  
                    using (SqlCommand command = connection.CreateCommand())  
                    {  
                        command.CommandText = "select Password,UserID  from Users";  
                        connection.Open();  
                        tables.Load(command.ExecuteReader(CommandBehavior.CloseConnection));  
                    }  
                    foreach (DataRow row in tables.Rows)  
                    {  
                        if (row[0] != null)  
                        {  
                            using (SqlConnection connection1 = new SqlConnection(connectionString))  
                            {  
  
                                for (int i = 0; i < tables.Rows.Count; i++)  
                                {  
                                    string decryptedPwd = Decrypt(tables.Rows[i]["Password"].ToString());  
                                    using (SqlCommand command = connection1.CreateCommand())  
                                    {  
                                        command.CommandText = "update users set password='" + decryptedPwd + "'  where UserID= '" + tables.Rows[i]["UserID"].ToString() + "' ";  
                                        connection1.Open();  
                                        command.ExecuteNonQuery();  
                                        lblMsg.Visible = true;  
                                        lblMsg.Text = "Congratulations!You have Successfully Decrypted all fields";  
                                        connection1.Close();  
                                    }  
  
                                }  
  
                            }  
  
  
                        }  
                    }  
                }  
  
            }  
        }  
  
        private void btnEncrypt1_Click(object sender, EventArgs e)  
        {  
            if (txtConString.Text == "")  
            {  
                error.SetError(txtConString, "Enter the text you want to encrypt");  
            }  
            else  
            {  
                string connectionString = txtConString.Text;  
                DataTable tables = new DataTable("Tables");  
                using (SqlConnection connection = new SqlConnection(connectionString))  
                {  
                    using (SqlCommand command = connection.CreateCommand())  
                    {  
                        command.CommandText = "select Password,UserID  from Users";  
                        connection.Open();  
                        tables.Load(command.ExecuteReader(CommandBehavior.CloseConnection));  
                    }  
                    foreach (DataRow row in tables.Rows)  
                    {  
                        if (row[0] != null)  
                        {  
                            using (SqlConnection connection1 = new SqlConnection(connectionString))  
                            {  
  
                                for (int i = 0; i < tables.Rows.Count; i++)  
                                {  
                                    string decryptedPwd = Encrpyt(tables.Rows[i]["Password"].ToString());  
                                    using (SqlCommand command = connection1.CreateCommand())  
                                    {  
                                    command.CommandText = "update users set password='" + decryptedPwd + "'  where UserID= '" + tables.Rows[i]["UserID"].ToString() + "' ";  
                                 // command.CommandText = "update users set password='" + decryptedPwd + "'  where UserID= '" + tables.Rows[i]["UserID"].ToString() + "' and password='" + Encrpyt(password) + "'";  
                                    connection1.Open();  
                                    command.ExecuteNonQuery();  
                                    lblMsg.Visible = true;  
                                    lblMsg.Text = "Congratulations!You have Successfully Encrpytted all fields";  
                                    connection1.Close();  
                                    }  
  
                                }  
  
                            }  
  
  
                        }  
                    }  
                }  
            }  
        }  
  
        private void btnClear_Click(object sender, EventArgs e)  
        {  
            error.Clear();  
            txtClearText.Visible = true;  
            lblPassword.Visible = true;  
            txtCipherText.Text = "";  
            txtClearText.Text = "";  
            txtClearText.Enabled = true;  
        }  
  
        private void btnClear1_Click(object sender, EventArgs e)  
        {  
            error.Clear();  
            txtConString.Text = "";  
            cmbTables.Text = "";  
            cmbTables.Items.Clear();  
            cmbColumns.Text = "";  
            lblMsg.Visible = false;  
            cmbColumns.Items.Clear();  
        }  
  
        private void btnGetTables_Click(object sender, EventArgs e)  
        {  
            try  
            {  
  
                if (txtConString.Text == "")  
                {  
                    error.SetError(txtConString, "Enter the Correct Connectionstring");  
                }  
                else  
                {  
                    string connectionString = txtConString.Text;  
                    DataTable tables = new DataTable("Tables");  
                    using (SqlConnection connection = new SqlConnection(connectionString))  
                    {  
                        using (SqlCommand command = connection.CreateCommand())  
                        {  
                            command.CommandText = "select table_name as Name from INFORMATION_SCHEMA.Tables where TABLE_TYPE = 'BASE TABLE'";  
                            connection.Open();  
                            tables.Load(command.ExecuteReader(CommandBehavior.CloseConnection));  
                        }  
                    }  
                    foreach (DataRow row in tables.Rows)  
                    {  
                        cmbTables.Items.Add(row[0].ToString());  
                    }  
                }  
            }  
  
            catch  
            {  
                error.SetError(txtConString, "Enter the Correct Connectionstring");  
            }  
        }  
  
        private void btnGetColumns_Click(object sender, EventArgs e)  
        {  
            if (cmbTables.Text == "")  
            {  
                error.SetError(cmbTables, "Select the Correct Column");  
            }  
            else  
            {  
                string connectionString = txtConString.Text;  
                DataTable tables = new DataTable("Tables");  
                using (SqlConnection connection = new SqlConnection(connectionString))  
                {  
                    using (SqlCommand command = connection.CreateCommand())  
                    {  
                        command.CommandText = "select column_name as Name from INFORMATION_SCHEMA.Columns where TABLE_NAME = 'Users'";  
                        connection.Open();  
                        tables.Load(command.ExecuteReader(CommandBehavior.CloseConnection));  
                    }  
                }  
                foreach (DataRow row in tables.Rows)  
                {  
                    cmbColumns.Items.Add(row[0].ToString());  
                }  
            }  
        }  
  
        
  private void button1_Click(object sender, EventArgs e)  
        {  
            string[] strArConString;  
            string strConnectionstring = string.Empty;  
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)  
            {  
                  
                string strFilevalue;  
                strFilevalue= File.ReadAllText(openFileDialog1.FileName);  
                 
                strArConString = strFilevalue.Split('<','>');  
                for (int i = 0; i < strArConString.Length; i++)  
                {  
                    if (strArConString[i] == "ConnectionString")  
                    {  
                        strConnectionstring = strArConString[i + 1];  
                        break;  
                    }  
  
                }  
  
                txtConString.Text = strConnectionstring;  
  
  
            }  
        }  
  
          
private void txtClearText_TextChanged(object sender, EventArgs e)  
        {  
  
        }        
  
    }  
}  

مرحله ششم :  فایل CryptorEngine.cs .

 

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Security.Cryptography;  
using System.Configuration;  
  
namespace EnCryptDecrypt  
{  
    public class CryptorEngine  
    {  
        /// <summary>  
        /// Encrypt a string using dual encryption method. Return a encrypted cipher Text  
        /// </summary>  
        /// <param name="toEncrypt">string to be encrypted</param>  
        /// <param name="useHashing">use hashing? send to for extra secirity</param>  
        /// <returns></returns>  
        public static string Encrypt(string toEncrypt, bool useHashing)  
        {  
            byte[] keyArray;  
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);  
  
            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();  
            // Get the key from config file  
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));  
            //System.Windows.Forms.MessageBox.Show(key);  
            if (useHashing)  
            {  
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();  
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));  
                hashmd5.Clear();  
            }  
            else  
                keyArray = UTF8Encoding.UTF8.GetBytes(key);  
  
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();  
            tdes.Key = keyArray;  
            tdes.Mode = CipherMode.ECB;  
            tdes.Padding = PaddingMode.PKCS7;  
  
            ICryptoTransform cTransform = tdes.CreateEncryptor();  
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);  
            tdes.Clear();  
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);  
        }  
        /// <summary>  
        /// DeCrypt a string using dual encryption method. Return a DeCrypted clear string  
        /// </summary>  
        /// <param name="cipherString">encrypted string</param>  
        /// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>  
        /// <returns></returns>  
        public static string Decrypt(string cipherString, bool useHashing)  
        {  
            byte[] keyArray;  
            byte[] toEncryptArray = Convert.FromBase64String(cipherString);  
  
            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();  
            //Get your key from config file to open the lock!  
            string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));  
              
            if (useHashing)  
            {  
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();  
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));  
                hashmd5.Clear();  
            }  
            else  
                keyArray = UTF8Encoding.UTF8.GetBytes(key);  
  
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();  
            tdes.Key = keyArray;  
            tdes.Mode = CipherMode.ECB;  
            tdes.Padding = PaddingMode.PKCS7;  
  
            ICryptoTransform cTransform = tdes.CreateDecryptor();  
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);  
                          
            tdes.Clear();  
            return UTF8Encoding.UTF8.GetString(resultArray);  
        }  
    }  
}  


مرحله هفتم : حال ، در خروجی خواهیم داشت :

اینجا ، ما مقدار “Rc3xvx8c7GM=” را تحت عنوان پسورد رمزگذاری شده وارد میکنیم و دکمه decrypt را میزنیم .

 



ما پسورد رمزگشایی شده را تحت عنوان "a" دریافت خواهیم کرد . 



ما همچنی توانایی decrypt/encrypt داده های یک database را با هر connection string که داده شود ، داریم . 


 

فایل های ضمیمه
دانلود نسخه ی PDF این مطلب