ساخت نرم افزار رمزنگار متن-بخش دوم
صفحه اصلی / دوره‌های آموزشی / آموزش ویندوز فرم سی شارپ، مقدماتی / ساخت نرم افزار رمزنگار متن-بخش دوم

ساخت نرم افزار رمزنگار متن-بخش دوم

ساخت نرم افزار رمزنگار متن-بخش دوم
0 تومان
براي خريد اين درس نياز است وارد سايت شويد. در صورت نداشتن حساب کاربري عضو شويد.
ساخت برنامه رمزنگار متن (قسمت دوم)
در جلسه قبل ظاهر برنامه را به اتمام رساندیم در این جلسه میخواهم بخش کدنویسی برنامه را به اتمام برسانیم به این منظور که اگر در قسمت رمزنگاری متنی را وارد کردیم بر اساس یکی از حروف، متن را برای ما رمزنگاری کند. در ساخت این برنامه هدف ما آموزش رمزنگاری نیست چرا که میخواهیم مفاهیمی را که به شما آموزش داده‌ایم را بیشتر با آنها آشنا شوید به همین منظور ما از یک روش رمزنگاری ساده به نام سزار استفاده میکنیم. رمزنگار سزار یک رمزنگار خیلی ساده برای حروف الفبا است، این رمزنگار به این صورت کار میکند که ما به هرکدام از حروف الفبا یک عدد نسبت میدهیم و اگر ما حروف الفبا لاتین را در نظر بگیریم از 0 تا 25 که شامل 26 حروف الفبا لاتین است به آن  اختصاص داده میشود.

ادامه ساخت رمزنگار متن ر ویندوز فرم
در رمزنگار سزار کلمات حرف به حرف رمز میشوند.
برای رمزنگاری ما از این فرمول استفاده میکنیم که اگر بخواهیم حرف a را بر اساس حرف D رمزنگاری کنیم به این صورت میشود که شماره A برابر با 0 است و شماره D برابر با 3 است، عددهای آنها با هم جمع میشوند.
عدد حاصل که برابر با 3 است، باقی مانده‌اش از 26 را بدست می‌آوریم ، جوابی که در آخر بدست می‌آید را در این جدول قرار میدهیم تا معادل حرف آن را پیدا کنیم که معدل این جمع بالا برابر حرف D میشود.
حال میخواهیم این مفاهیم را در سی‌شارپ پیاده‌سازی کنیم برای این کار یک class با نام (sezaralgorithm) به پروژه اضافه میکنیم.
برای تبدیل متن به عدد و عدد به متن چند متد در کلاس تعریف میکنیم. چرا که در برنامه نیاز داریم که حروف را به عدد تبدیل کنیم و از عدد را به حرف برسانیم، البته توجه داشته باشید که ، حروف کوچک و
حروف بزرگ داریم که باید برای هر دو حالت یک تابع تعریف کنیم .
ابتدا میخواهیم حرف بزرگ را به عدد تبدیل کنیم ، تابع ما به این صورت کار میکند که یک کارکتر از ورودی دریافت میکند و عدد معادل آن را باز می‌گرداند.
کاین تابع در سی‌شارپ با نام اختصاری upertoint نام گذاری شده است که یک کارکتر از ورودی دریافت میکند و مقدار کارکتر را منهای 65 میکنیم و مقدار برگشتی را به تابع بازمیگردانیم.
کد اسکی حروف بزرگ 26 شروع میشوند تا 65 ادامه میابند و زمانی که ما آن ها را از 65 کم میکنیم عددی از بین 0 تا 26 بدست می‌آید .
namespace persianedito
{
    class sezaralgorithm
    {
public int upreToint(char ch)
        {
            return ch - 65;
        }
برای بدست آوردن معدل عددی حروف کوچک از تابع مخصوص آن که با نام  lowertoint مشخص شده، استفاده میکنیم که از ورودی یک کارکتر دریافت میکند و برای ما معدل عدد آن را به تابع بازمیگرداند و ما آن را از 97 کم میکنیم چرا که اعداد کوچک از65 شروع میشوند تا 97 ادامه پیدا میکند.
public int lowerToint(char ch)
        {
            return ch - 97;
        }
بعد از تابع های تبدیل حروف به اعداد باید تابع هایی برای تبدیل اعداد به حروف هم تعریف کنیم .
این تابع ها با نامInttouper مشخص شده اند که مقدار ورودی آنها عدد هستند و در این تابع باید مقدار عددی ورودی را به کارکتر تبدیل کنیم و این کارکتر را با 65 جمع کنیم تا عدد معادل حروف بزرگ بدست آید.
public int intToUper(int value)
        {
            return (char)(value+65);
        }
تابع بعدی هم عدد را به حروف کوچ تبدیل میکند که با نام inttoower قرار دارد و که عدد ورودی را به کارکتر تبدیل میکند با 97 جمع کرده تا عدد معادل حروف کوچک را بدست آورد.
public int intTolower(int value)
        {
            return (char)(value+97);
        }
تا اینجا چهار تابع برای تبدیل عدد به حروف و حروف به عدد ساخته شدند.
حال باید متد هایی بسازیم که مشخص کند حروف کوچک است یا بزرگ که با متد مخصوص خودش رمزنگاری را انجام دهد.
تابع اول ما با نام islower است که دورن آن شرطی قرار گرفته ، اگر حروف کوچک باشد مقدار برگشتی true میباشد و اگر حروف بزرگ باشد مقدار برگشتی false میباشد.
 برای تشخیص حروف بزرگ و کوچک از کد اسکی استفاده میکنیم، حروف کوچک اعدادی هستند بین 97 تا 122 که اگر شرط درست باشد مقدار برگشتی true است در غیر این صورت یعنی اگر بین این بازه عددی نباشد مقدار برگشتی false است.
public bool islower(char ch)
        {
            if (ch >= 97 && ch <= 122)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
برای تشخیص حروف بزرگ از یک تابع با نام isuper  استفاده میکنیم ولی شرط ما به این صورت است که عدد کارکتر ورودی باید بین کد اسکی 65 تا 90 باشد که مقدار برگشتی true شود و در غیر این صورت مقدار برگشتی false است.
public bool isUper(char ch)
        {
            if (ch >= 65 && ch <= 90)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
در بالا به کمک دو تابعی که ساختیم ،اول از همه مشخص میکردیم که کارکتر ما بین حروف بزرگ یا حروف کوچک قرار گرفته است که به کمک دو متد اول ،حروف کوچک و به عدد تبدیل  به کمک دو متد دوم اعداد را به  حروف کوچک وبزرگ تبدیل میکردیم.
حال به دو تابع دیگر برای عملیات رمزنگاری و رمزگشایی نیاز داریم و از آن متدهایی که قبلا درست کردیم در این تابع‌ها استفاده کنیم.
ابتدا یک تابع با مقدار برگشتی از نوع string با نام  encryption تعریف میکنیم، که از ورودی یک متن برای رمزنگاری و یک کلید  دریافت میکند تا  یک متن را به متن رمزنگاری شده تبدیل کند
کاری که در این تابع باید انجام دهیم این است که حرف ورودی که با نام textencryption   مشخص کردیم را حرف به حرف رمزگذاری باید کنیم پس یک آرایه کارکتری با نام plaintetx تعریف میکنیم تا کلمه ورودی را حرف به حرف جدا کنیم و داخل این آرایه قرار میدهیم.
درگام بعدی یک آرایه کارکتری با نام ciphertext تعریف میکنیم برای اینکه معادل رمزشده هر حرف را داخل آرایه قرار بدهیم ولی طول آرایه باید به اندازه متن ورودی باشد
public string encryption(string textToencryption, char key)
        {
            char[] plaintext = textToencryption.ToCharArray();
            char[] cipher = new char[textToencryption.Length];
        
        }
حالا باید حرف به حرف آرایه plaintext رمزگذاری کنیم و در در آرایه  ciphertext قرار دهیم برای اجرای این عملیات یک حلقه تکرار تعریف میکنیم تا شمارنده حلقه از 0 شروع کند تا طول متن ورودی ادامه پیدا کند و کاری که قرار است در حلقه انجام دهیم کلمات را حرف به حرف روبه جلو کلمات را رمزگذاری کند و در آرایه  ciphertext قرار دهد.
در حین رمزگذاری ممکن است که حروف ما ، بزرگ و یا کوچک باشند پس باید شرطی قرار دهیم و در شرط از تابعی که مشخص میکرد حروف بزرگ یا کوچک است استفاده میکنیم
 اگر در تابع islower مقدار برگشتی برابر با true باشد ،حرف ما کوچک است و رمزنگاری را با توجه به حرف کوچک انجام دهد و برای انجام این عملیات عدد معادل plaintext[i] و عدد معادل کلید key  را بدست می‌آوریم با هم جمع و mod26 را بدست می‌آوریم جواب بدست آمده درا توسط تابع inttolower به حرف تبدیل کرده و در آرایه ciphertext قرار میدهیم
for (int i = 0; i < textToencryption.Length; i++)
   {
        if (islower(plaintext[i]) == true)
        {
         ciphertext[i] = intTolower((lowerToint(plaintext[i]) + upreToint(key)) % 26);
         } 
شرط دیگر در حلقه این خواهد بود که ممکن است حروف بزرگ باشند، باید همانند بالا همه را در تابع های مربوط به خود قرار دهیم.
if (isUper(plaintext[i]) == true)
    {
      ciphertext[i] = intToUper((upreToint(plaintext[i]) + upreToint(key)) % 26);
     }
در حلقه تکرار تمام حروف را یکی یکی به متن رمز شده تبدیل میکردیم و در آرایه قرار دادیم حال باید متن داخل ciphertext را به رشته تبدیل کنیم
و برای تبدیل یک آرایه کارکتری به رشته میتوانیم از یک حلقه تکرار استفاده کنیم  که شماره حلقه تکرار به اندازه طول کارکترها برود و حروف آرایه ciphertext یکی یکی به رشته تبدیل کند و در یک متغییر از نوع string با نام cipher در کنار هم قرار دهد. و در نهایت cipher را به تابع باز میگردانیم.
            string cipher = "";
            for (int i = 0; i < textToencryption.Length; i++)
            {
                cipher += ciphertext[i].ToString(); 
            }
برای رمزگشایی هم یک متد دیگر با نام decriotion که خروجی string دارد و یک رشته با نام textyodecript  برای رمزگشایی و یک کلید از نوع char با نام key برای اینکه رمزگشایی را طبق این کلید انجام دهد از ورودی دریافت میکند.
در این تابع میتوانیم از همه کدی که در تابع قبل ساختیم استفاده کنیم و فقط یک سری تفاضل با هم دارند که باید آنها را رفع کنید  
public string decription(string textTodecription, char key)
    {
        string plain = "";
        char[] plaintext = new char[textTodecription.Length];
        char[] ciphertext = textTodecription.ToCharArray();
            
        for (int i = 0; i < textTodecription.Length; i++)
         {
            if (islower(ciphertext[i]) == true)
            {
             plaintext[i] = intTolower((lowerToint(ciphertext[i]) + upreToint(key)) % 26);
            }
            if (isUper(plaintext[i]) == true)
            {
               plaintext[i] = intToUper((upreToint(ciphertext[i]) + upreToint(key)) % 26);
            }  
          }
            
          for (int i = 0; i < textTodecription.Length; i++)
          {
                plain += plaintext[i].ToString();
                return plain;
          }
        }
در آخر همه را در یک متغییر از نوع string با نام pliain میریزیم و مقدار برگشتی را به تابع بازمیگردانیم تا در پروژ از آن استفاده کنیم.
حال به form قسمت رمزنگاری میرویم و هنگامی که کاربر متنی را وارد کرد و دکمه رمزنگاری را کلید کرد متن وارد شده رمز شود و در کادر بعدی نمایش داده شود.
به رویداد فعال دکمه میرویم و در آن رویداد از کلاسی که با نام sezaralgorithm ایجاد کردیم یک شی ایجاد میکنیم تا بتوانیم از متد های که ایجاد کردیم استفاده کنیم .
ابتدا از متد رمزنگاری استفاده میکنیم،  آن را فراخوانی میکنیم که از ما دو ورودی، متن و کلید دریافت میکند.
در ورودی اول که از ما متن میگرفت ، متن وارد شده در کادر متن را قرار دهیم و در ورودی دوم که کلید بود گزینه انتخاب شده کاربر از combobox را قرار میدهیم.
ولی توجه داشته باشید اطلاعات موجود در combobox متن است و تابع ما فقط یک کلید دریافت میکند، که  باید در همان لحظه متن داخل combobox را به کلید تبدیل کنید. ومقدار برگشتی را در textcipher قرار دهید.
private void btnencripttext_Click(object sender, EventArgs e)
        {
            sezaralgorithm sezar = new sezaralgorithm();
            txtcipher.Text = sezar.encription(txtplain.Text, Convert.ToChar(cmbKey.Text));
        }
رمزنگاری متن ما کامل شد حال به قسمت  رمزنگاری فایل میرویم در این قسمت ابتدا باید یک نام فایل برای رمزنگاری و فایل رمزشده انتخاب کنیم که وقتی بر روی دکمه رمزنگاری کلیک کنیم متن بالا به متن رمزشده در کادر متن پایین تبدیل شود.
یک OpenFileDialog و یک SaveFileDoalog به Form اضافه میکنیم و میخواهیم زمانی بر روی دکمه پایین

رمزنگار متن در windows form
از کاربر آدرس فایل را دریافت کند و اگر کاربر ok  کرد OpenFileDialog برای ما اجرا شود  کادر متن روبه روی دکمه که با نام txtplainFilename با OpenFileDialog  مقدار دهی شود . و متن داخل فایل هم خوانده شود که در رمزنگاری از آن استفاده کنیم.
private void btnplainbrows_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.ok)
            {
                txtplainfilename.Text = openFileDialog1.FileName;
            }
        }

دو رشته با نام  plaintext و ciphertext در بالا خارج از متد تعریف میکنیم.
namespace persianedito
{
    public partial class frmencription : Form
    {

        string plaintext = "";
        string ciphertext = "";
در گام بعدی متن را از فایل انتخاب شده میخوانیم و در متغییر plaintext قرار میدهیم.
private void btnplainbrows_Click(object sender, EventArgs e)
        {
            string plaintext = "", ciphertext = "";
            if (openFileDialog1.ShowDialog() == DialogResult.ok)
            {
                txtplainfilename.Text = openFileDialog1.FileName;
                plaintext = System.IO.File.ReadAllText(txtplainfilename.Text);
            }
        }
 و برای رمزنگاری متن از کلاس sezaralgorithm یک شی ایجاد کرده و از تابع encriptin استفاده میکنیم که از ما دو ورودی دو ورودی دریافت میکند.اولین ورودی متنی است که باید رمز شود و در متغییر plaintext قرار دارد و دومین ورودی کلیدی است که در combobox قرار دارد و باید در همان لحظه متن داخل combobox  را به char تبدیل کنیم. و معادل رمز شده را در رشته‌ای که با نام ciphertext  در بالا تعریف کردیم قرار دهیم.
private void btnplainbrows_Click(object sender, EventArgs e)
        {
            string plaintext = "", ciphertext = "";
            sezaralgorithm sezar = new sezaralgorithm();
            if (openFileDialog1.ShowDialog() == DialogResult.ok)
            {
                txtplainfilename.Text = openFileDialog1.FileName;
                plaintext = System.IO.File.ReadAllText(txtplainfilename.Text);
                ciphertext = sezar.encription(plaintext, Convert.ToChar(cmbfilekey));
            }
        }
حالا متغییر ciphertext که حاوی متن رمزنگاری شده است را داخل یک فایل انتخاب شده توسط کاربر قرار میدهیم که توسط دکمه ذخیره شود.
ادامه ساخت نرم افزار رمزنگار متن
برای اینکه فایل مورد نظر را کاربر انتخاب کند به رویداد کلیک دکمه میرویم ورد در کد نویسی از SaveFileDoalog  که قبلا اضافه کردیم استفاده میکنیم ، آن را در شرطی قرار میدهیم که اگر کاربر ok کرد برای ما یک سری از عملیات را انجام دهد.
در شرط،  ciphertext را در فایلی که کاربر انتخاب کرده مینویسیم و آدرس فایل را در کادر متن به کاربر نمایش میدهیم.
private void btncipherbrows_Click(object sender, EventArgs e)
        {
            
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                txtcipherfilename.Text = saveFileDialog1.FileName;
                System.IO.File.WriteAllText(saveFileDialog1.FileName,ciphertext);
              
            }
        }
تا این مرحله کل قسمت formencription را تکمیل کردیم که برای رمزنگاری متن و فایل استفاده میشد.
که تنها formdecription باقی مانده است.
به قسمت اول formdecription که رمزگشایی متن بود میرویم
به رویداد دکمه رمزگشایی میرویم و قرار است متن کادر متن اول که رمز شده است را رمزگشایی کنیم و در کادر متن دوم متن رمزگشایی شده را نمایش دهیم.
از کلاس sezaralgorithm یک شی ایجاد میکنیم تا بتوانیم از تمام متد های آن استفاده کنیم.
و از شی که ساختیم، متد decription را  استفاده میکنیم که دو ورودی،  متن و کلید دریافت میکند و متن رمزگشایی شده را به ما تحویل میداد.
private void btncipttext_Click(object sender, EventArgs e)
        {
            sezaralgorithm sezar = new sezaralgorithm();
            txtplain.Text = sezar.decription(txtcipher.Text, Convert.ToChar(cmbKey.Text));
           
        }

 

جلسات دوره


          
22 دقیقه
رایگان
           
مهدی احمدی
مدرس :

مهدی احمدی

از سال 1380 برنامه نویسی را شروع کرده و از سال 90 در این زمینه تدریس میکنم .با زبانهای سی پلاس پلاس ، سی ،پاسکال ،VB ، سی شارپ ،اسمبلی، جاوا و .... کار کرده و آنها را تدریس کرده ام.هم اکنون نیز مشغول تدریس در دانشگاه هستم و مدتی است با سایت درسمن همکاری میکنم مطالعه بیشتر

نظر شما در تصمیم دیگران اثرگذار است.

لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.

برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.

نظرات دانشجویان

آموزش ویندوز فرم سی شارپ، مقدماتی

128