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

شنبه 6 شهریور 1395

در این مقاله ، توضیحاتی در مورد 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 که داده شود ، داریم . 


 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید