2์ฐจ์› ๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ ๋‹คํ‘œ์‹ ํ™˜์ž ์•”ํ˜ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• (C#)(Implementing Multi-Tab Patient Encryption Using 2D Arrays in C#)

2024. 6. 14. 06:47ใ†Development๐Ÿ‘ฉ๐Ÿป‍๐Ÿฆณ/C#

[์˜ˆ์ œ 3] 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋‹คํ‘œ์‹ ํ™˜์ž ์•”ํ˜ธ ๊ตฌํ˜„.zip

๊ตฌํ˜„ํ•œ Vigenere ์•”ํ˜ธํ™” ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ฃผ์š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ์ฃผ์š” ๊ตฌํ˜„ ๋ผ์ธ, ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž, ํ•จ์ˆ˜๋“ค์˜ ํ๋ฆ„์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ ๊ตฌ์กฐ

Vigenere ์•”ํ˜ธํ™” ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ Vigenere ํ‘œ๋ฅผ ์ด์šฉํ•ด ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” Windows Forms๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์ฃผ์š” ๋กœ์ง์€ Form1 ํด๋ž˜์Šค์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ

Vigenere ํ…Œ์ด๋ธ”

csharp์ฝ”๋“œ ๋ณต์‚ฌ
// Vigenere ํ…Œ์ด๋ธ” ์ƒ์„ฑ
String[,] Vigenere_Table = new String[26, 26];
for (int i = 0; i < 26; i++)
{
    for (int j = 0; j < 26; j++)
    {
        Vigenere_Table[i, j] = ((char)((i + j) % 26 + 65)).ToString();
    }
}
  • ๋ฉ”์ปค๋‹ˆ์ฆ˜: Vigenere ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด. ๊ฐ ์…€์€ ๋ฌธ์ž 'A'๋ถ€ํ„ฐ 'Z'๊นŒ์ง€ ์ˆœํ™˜ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ง.
  • ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž: (i + j) % 26๋Š” ํ–‰๊ณผ ์—ด์˜ ํ•ฉ์„ 26์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ด ์•ŒํŒŒ๋ฒณ ์ธ๋ฑ์Šค๋ฅผ ๊ฒฐ์ •.

ํผ ์ดˆ๊ธฐํ™”

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void InitializeComponent()
{
    this.textBox1 = new TextBox();
    this.textBox2 = new TextBox();
    this.textBox4 = new TextBox();
    this.textBox5 = new TextBox();
    this.button1 = new Button();
    this.label1 = new Label();
    this.label2 = new Label();
    this.label3 = new Label();
    this.label4 = new Label();
    this.label5 = new Label();
    this.SuspendLayout();

    // textBox1 ์„ค์ •
    this.textBox1.BackColor = Color.FromArgb(26, 26, 26);
    this.textBox1.ForeColor = Color.White;
    this.textBox1.BorderStyle = BorderStyle.None;
    this.textBox1.Location = new Point(12, 70);
    this.textBox1.Name = "textBox1";
    this.textBox1.Size = new Size(776, 20);
    this.textBox1.TabIndex = 0;

    // ๋‚˜๋จธ์ง€ UI ์ปดํฌ๋„ŒํŠธ ์„ค์ • ์ƒ๋žต...

    // button1 ์„ค์ •
    this.button1.BackColor = Color.FromArgb(0, 122, 204);
    this.button1.FlatAppearance.BorderSize = 0;
    this.button1.FlatStyle = FlatStyle.Flat;
    this.button1.ForeColor = Color.White;
    this.button1.Location = new Point(380, 30);
    this.button1.Name = "button1";
    this.button1.Size = new Size(75, 23);
    this.button1.TabIndex = 4;
    this.button1.Text = "์•”ํ˜ธํ™”";
    this.button1.UseVisualStyleBackColor = false;
    this.button1.Click += new EventHandler(this.button1_Click);

    // ํผ ์„ค์ • ์ƒ๋žต...

    this.ResumeLayout(false);
    this.PerformLayout();
}
  • ๋ฉ”์ปค๋‹ˆ์ฆ˜: ํผ ์ดˆ๊ธฐํ™” ๋ฐ UI ๊ตฌ์„ฑ ์š”์†Œ ์„ค์ •.
  • UI ์ปดํฌ๋„ŒํŠธ: TextBox, Button, Label ๋“ฑ์˜ ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ.

๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ

csharp์ฝ”๋“œ ๋ณต์‚ฌ
private void button1_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "")
    {
        MessageBox.Show("ํ‰๋ฌธ์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์„ธ์š”.", "[ ๊ฒฝ๊ณ  1 ]");
        textBox1.Focus();
        return;
    }
    if (textBox4.Text == "")
    {
        MessageBox.Show("ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.", "[ ๊ฒฝ๊ณ  3 ]");
        textBox4.Focus();
        return;
    }

    int iMunjang_Giri = textBox1.TextLength; // TextLength : ํ…์ŠคํŠธ ๊ธธ์ด
    int isKeyword_Giri = textBox4.TextLength;
    string[] sMunjang = new string[iMunjang_Giri];
    string[] sKeyword_Munjang = new string[isKeyword_Giri];

    for (int iCount = 0; iCount < iMunjang_Giri; iCount++)
    {
        sMunjang[iCount] = textBox1.Text.Substring(iCount, 1);
        // Sub string : ํ•˜์œ„ ๋ฌธ์ž์—ด
    }

    for (int iCount = 0; iCount < isKeyword_Giri; iCount++)
    {
        sKeyword_Munjang[iCount] = textBox4.Text.Substring(iCount, 1);
    }

    if (iMunjang_Giri > isKeyword_Giri)
    {
        for (int iCount = 1; iCount <= iMunjang_Giri - isKeyword_Giri; iCount++)
            textBox4.Text = textBox4.Text + textBox4.Text.Substring(iCount - 1, 1);
    }
    else if (iMunjang_Giri < isKeyword_Giri)
    {
        textBox4.Text = textBox4.Text.Substring(0, iMunjang_Giri);
    }

    isKeyword_Giri = textBox4.TextLength;
    sKeyword_Munjang = new string[isKeyword_Giri];

    for (int iCount = 0; iCount < isKeyword_Giri; iCount++)
    {
        sKeyword_Munjang[iCount] = textBox4.Text.Substring(iCount, 1);
    }

    textBox2.Text = "";
    for (int iCount = 0; iCount < iMunjang_Giri; iCount++)
    {
        char cTemp = Convert.ToChar(sMunjang[iCount]);
        char ccTemp = Convert.ToChar(sKeyword_Munjang[iCount]);
        int iTemp = Convert.ToInt32(cTemp);
        int iiTemp = Convert.ToInt32(ccTemp);
        sMunjang[iCount] = Vigenere_Table[iTemp - 97, iiTemp - 97];
        textBox2.Text = textBox2.Text + sMunjang[iCount];
    }
}
  • ๋ฉ”์ปค๋‹ˆ์ฆ˜: ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฒ€์ฆํ•˜๊ณ , ์ž…๋ ฅ๋œ ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ ๊ธธ์ด๋ฅผ ๋งž์ถ”๊ณ , Vigenere ์•”ํ˜ธํ™” ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•ด ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑ.
  • ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž: iTemp - 97, iiTemp - 97๋Š” ASCII ๊ฐ’์„ ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜.
  • ํ•จ์ˆ˜์˜ ํ๋ฆ„:
    1. ์ž…๋ ฅ ๊ฒ€์ฆ: ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ.
    2. ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ ๊ธธ์ด ์กฐ์ •: ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ ๊ธธ์ด๋ฅผ ๋งž์ถค.
    3. ์•”ํ˜ธํ™” ์ˆ˜ํ–‰: ๊ฐ ๋ฌธ์ž๋ฅผ Vigenere ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์•”ํ˜ธํ™”.

๊ฒฐ๋ก 

  • ์žฅ์ : ์ฝ”๋“œ๊ฐ€ ๋ช…ํ™•ํ•˜๋ฉฐ, Vigenere ์•”ํ˜ธํ™”์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ž˜ ๊ตฌํ˜„. UI ๊ตฌ์„ฑ๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€.
  • ๋‹จ์ : ํ‚ค์›Œ๋“œ ๊ธธ์ด๋ฅผ ํ‰๋ฌธ ๊ธธ์ด์— ๋งž์ถ”๋Š” ๊ณผ์ •์ด ๋น„ํšจ์œจ์ . ๋” ํฐ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ.
  • ๊ฐœ์„ ์ : ํ‚ค์›Œ๋“œ ๊ธธ์ด ์กฐ์ • ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๊ณ , ๋” ํฐ ์ž…๋ ฅ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•„์š”.

์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด Vigenere ์•”ํ˜ธํ™”์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ค์ œ ์‚ฐ์—… ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ ์ตœ์ ํ™”์™€ ๋ณด์•ˆ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


using System;
using System.Drawing;
using System.Windows.Forms;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        // Vigenere ์•”ํ˜ธํ™” ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด
        String[,] Vigenere_Table = new String[26, 26];

        public Form1()
        {
            InitializeComponent();

            // Vigenere ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”
            for (int i = 0; i < 26; i++)
            {
                for (int j = 0; j < 26; j++)
                {
                    Vigenere_Table[i, j] = ((char)((i + j) % 26 + 65)).ToString();
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // ํ‰๋ฌธ์ด ์ž…๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
            if (textBox1.Text == "")
            {
                MessageBox.Show("ํ‰๋ฌธ์„ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด์„ธ์š”.", "[ ๊ฒฝ๊ณ  1 ]");
                textBox1.Focus();
                return;
            }

            // ํ‚ค์›Œ๋“œ๊ฐ€ ์ž…๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ
            if (textBox4.Text == "")
            {
                MessageBox.Show("ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.", "[ ๊ฒฝ๊ณ  3 ]");
                textBox4.Focus();
                return;
            }

            // ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜ด
            int iMunjang_Giri = textBox1.TextLength;
            int isKeyword_Giri = textBox4.TextLength;
            string[] sMunjang = new string[iMunjang_Giri];
            string[] sKeyword_Munjang = new string[isKeyword_Giri];

            // ํ‰๋ฌธ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅ
            for (int iCount = 0; iCount < iMunjang_Giri; iCount++)
            {
                sMunjang[iCount] = textBox1.Text.Substring(iCount, 1);
            }

            // ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅ
            for (int iCount = 0; iCount < isKeyword_Giri; iCount++)
            {
                sKeyword_Munjang[iCount] = textBox4.Text.Substring(iCount, 1);
            }

            // ํ‰๋ฌธ ๊ธธ์ด๊ฐ€ ํ‚ค์›Œ๋“œ ๊ธธ์ด๋ณด๋‹ค ๊ธด ๊ฒฝ์šฐ, ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ธธ์ด๋ฅผ ๋งž์ถค
            if (iMunjang_Giri > isKeyword_Giri)
            {
                for (int iCount = 1; iCount <= iMunjang_Giri - isKeyword_Giri; iCount++)
                    textBox4.Text = textBox4.Text + textBox4.Text.Substring(iCount - 1, 1);
            }
            // ํ‚ค์›Œ๋“œ ๊ธธ์ด๊ฐ€ ํ‰๋ฌธ ๊ธธ์ด๋ณด๋‹ค ๊ธด ๊ฒฝ์šฐ, ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ํ‰๋ฌธ ๊ธธ์ด์— ๋งž์ถค
            else if (iMunjang_Giri < isKeyword_Giri)
            {
                textBox4.Text = textBox4.Text.Substring(0, iMunjang_Giri);
            }

            // ์กฐ์ •๋œ ํ‚ค์›Œ๋“œ ๊ธธ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ด
            isKeyword_Giri = textBox4.TextLength;
            sKeyword_Munjang = new string[isKeyword_Giri];

            // ์กฐ์ •๋œ ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅ
            for (int iCount = 0; iCount < isKeyword_Giri; iCount++)
            {
                sKeyword_Munjang[iCount] = textBox4.Text.Substring(iCount, 1);
            }

            // ์•”ํ˜ธ๋ฌธ์„ ์ดˆ๊ธฐํ™”
            textBox2.Text = "";

            // ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ Vigenere ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์•”ํ˜ธํ™”
            for (int iCount = 0; iCount < iMunjang_Giri; iCount++)
            {
                char cTemp = Convert.ToChar(sMunjang[iCount]);
                char ccTemp = Convert.ToChar(sKeyword_Munjang[iCount]);
                int iTemp = Convert.ToInt32(cTemp);
                int iiTemp = Convert.ToInt32(ccTemp);
                sMunjang[iCount] = Vigenere_Table[iTemp - 97, iiTemp - 97];
                textBox2.Text = textBox2.Text + sMunjang[iCount];
            }
        }
    }
}

  • Vigenere์ด๋ฆ„์—์„œ ์œ ๋ž˜ํ•œ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. Vigenere ์•”ํ˜ธ (๋น„์ €๋„ค์–ด๋ ˆ์ด) ๋Š” ๊ทธ๊ฐ€ ๊ณ ์•ˆํ•œ ๋‹ค์ค‘ ์•ŒํŒŒ๋ฒณ ์น˜ํ™˜ ์•”ํ˜ธ ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ช…์นญ ์œ ๋ž˜: Blase de Vigenère (๋ธ”๋ ˆ์ด์ฆˆ ๋” ๋น„๊ฑด ๋ ˆ์ด)
    • ์„ค๋ช…: ๋‹ค์ค‘ ์•ŒํŒŒ๋ฒณ ์น˜ํ™˜ ์•”ํ˜ธ์˜ ํ•œ ํ˜•ํƒœ๋กœ, ์•”ํ˜ธํ™”ํ•  ๋•Œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์—ฌ๋Ÿฌ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ์‹œ
    1. ํ‰๋ฌธ: HELLO
    2. ํ‚ค์›Œ๋“œ: KEY
    3. ์•”ํ˜ธํ™”๋œ ํ…์ŠคํŠธ: RIJVS (ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณต ์ ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์น˜ํ™˜์„ ์ ์šฉ)
  • Vigenere ์•”ํ˜ธ
  • Vigenere๋Š” ์•ฝ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, 16์„ธ๊ธฐ ํ”„๋ž‘์Šค์˜ ์•”ํ˜ธํ•™์ž Blase de Vigenère์˜
  • ์‚ฌ์šฉ๋œ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋“ค์˜ ์—ญํ• 
    1. Form1()
      • ์—ญํ• : ํด๋ž˜์Šค ์ƒ์„ฑ์ž. ํผ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  Vigenere ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ๊ตฌํ˜„: InitializeComponent()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํผ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , Vigenere ํ…Œ์ด๋ธ”์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. button1_Click(object sender, EventArgs e)
      • ์—ญํ• : "์•”ํ˜ธํ™”" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ. ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด Vigenere ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ตฌํ˜„: ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๊ธธ์ด๋ฅผ ๋งž์ถ”๊ณ , Vigenere ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์•”ํ˜ธํ™”ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    ๋ณ€์ˆ˜๋“ค
    1. String[,] Vigenere_Table
      • ์—ญํ• : Vigenere ์•”ํ˜ธํ™” ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: 26x26 ํฌ๊ธฐ์˜ ํ…Œ์ด๋ธ”๋กœ, ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋ฅผ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
    2. int iMunjang_Giri
      • ์—ญํ• : ํ‰๋ฌธ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅ.
      • ๊ตฌํ˜„: textBox1.TextLength๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜ด.
    3. int isKeyword_Giri
      • ์—ญํ• : ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅ.
      • ๊ตฌํ˜„: textBox4.TextLength๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜ด.
    4. string[] sMunjang
      • ์—ญํ• : ํ‰๋ฌธ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: ํ‰๋ฌธ์˜ ๊ธธ์ด๋งŒํผ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ‰๋ฌธ์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์ €์žฅ๋จ.
    5. string[] sKeyword_Munjang
      • ์—ญํ• : ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋งŒํผ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์ €์žฅ๋จ.
    6. char cTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‰๋ฌธ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToChar(sMunjang[iCount])๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ด.
    7. char ccTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToChar(sKeyword_Munjang[iCount])๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ด.
    8. int iTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‰๋ฌธ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToInt32(cTemp)๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ๊ฐ€์ ธ์˜ด.
    9. int iiTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToInt32(ccTemp)๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ๊ฐ€์ ธ์˜ด.
    ์ฃผ์š” ํ๋ฆ„ ์„ค๋ช…
    1. ํผ ์ดˆ๊ธฐํ™” ๋ฐ Vigenere ํ…Œ์ด๋ธ” ์ƒ์„ฑ (Form1)
      • InitializeComponent()๋ฅผ ํ†ตํ•ด ํผ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Vigenere ํ…Œ์ด๋ธ”์„ 26x26 ํฌ๊ธฐ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ฐ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ (button1_Click)
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•˜์—ฌ, ํ‰๋ฌธ์ด ๋” ๊ธธ๋ฉด ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ธธ์ด๋ฅผ ๋งž์ถ”๊ณ , ํ‚ค์›Œ๋“œ๊ฐ€ ๋” ๊ธธ๋ฉด ํ‚ค์›Œ๋“œ๋ฅผ ์ž˜๋ผ์„œ ๊ธธ์ด๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค.
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ Vigenere ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•ด ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
      • ์•”ํ˜ธํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ textBox2์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    ์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์ธ Vigenere ์•”ํ˜ธํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๊ฐ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•จ์œผ๋กœ์จ ์•”ํ˜ธํ™” ๊ณผ์ • ์ „๋ฐ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[์˜ˆ์ œ 2] 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋™์Œ์ด์˜์–ด ์•”ํ˜ธ ๊ตฌํ˜„.zip

  • [์˜ˆ์ œ 2] 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋™์Œ์ด์˜์–ด ์•”ํ˜ธ ๊ตฌํ˜„
  • Vigenere์ด๋ฆ„์—์„œ ์œ ๋ž˜ํ•œ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. Vigenere ์•”ํ˜ธ (๋น„์ €๋„ค์–ด๋ ˆ์ด) ๋Š” ๊ทธ๊ฐ€ ๊ณ ์•ˆํ•œ ๋‹ค์ค‘ ์•ŒํŒŒ๋ฒณ ์น˜ํ™˜ ์•”ํ˜ธ ๊ธฐ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ช…์นญ ์œ ๋ž˜: Blase de Vigenère (๋ธ”๋ ˆ์ด์ฆˆ ๋” ๋น„๊ฑด ๋ ˆ์ด)
    • ์„ค๋ช…: ๋‹ค์ค‘ ์•ŒํŒŒ๋ฒณ ์น˜ํ™˜ ์•”ํ˜ธ์˜ ํ•œ ํ˜•ํƒœ๋กœ, ์•”ํ˜ธํ™”ํ•  ๋•Œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์—ฌ๋Ÿฌ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ์‹œ
    1. ํ‰๋ฌธ: HELLO
    2. ํ‚ค์›Œ๋“œ: KEY
    3. ์•”ํ˜ธํ™”๋œ ํ…์ŠคํŠธ: RIJVS (ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณต ์ ์šฉํ•˜์—ฌ ๊ฐ ๋ฌธ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์น˜ํ™˜์„ ์ ์šฉ)
  • Vigenere ์•”ํ˜ธ
  • Vigenere๋Š” ์•ฝ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, 16์„ธ๊ธฐ ํ”„๋ž‘์Šค์˜ ์•”ํ˜ธํ•™์ž Blase de Vigenère์˜
  • ์‚ฌ์šฉ๋œ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋“ค์˜ ์—ญํ• 
    1. Form1()
      • ์—ญํ• : ํด๋ž˜์Šค ์ƒ์„ฑ์ž. ํผ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  Vigenere ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ๊ตฌํ˜„: InitializeComponent()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํผ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , Vigenere ํ…Œ์ด๋ธ”์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    2. button1_Click(object sender, EventArgs e)
      • ์—ญํ• : "์•”ํ˜ธํ™”" ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ. ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด Vigenere ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
      • ๊ตฌํ˜„: ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๊ธธ์ด๋ฅผ ๋งž์ถ”๊ณ , Vigenere ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์•”ํ˜ธํ™”ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    ๋ณ€์ˆ˜๋“ค
    1. String[,] Vigenere_Table
      • ์—ญํ• : Vigenere ์•”ํ˜ธํ™” ํ…Œ์ด๋ธ”์„ ์ €์žฅํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: 26x26 ํฌ๊ธฐ์˜ ํ…Œ์ด๋ธ”๋กœ, ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋ฅผ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
    2. int iMunjang_Giri
      • ์—ญํ• : ํ‰๋ฌธ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅ.
      • ๊ตฌํ˜„: textBox1.TextLength๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜ด.
    3. int isKeyword_Giri
      • ์—ญํ• : ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ์ €์žฅ.
      • ๊ตฌํ˜„: textBox4.TextLength๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ์˜ด.
    4. string[] sMunjang
      • ์—ญํ• : ํ‰๋ฌธ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: ํ‰๋ฌธ์˜ ๊ธธ์ด๋งŒํผ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ‰๋ฌธ์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์ €์žฅ๋จ.
    5. string[] sKeyword_Munjang
      • ์—ญํ• : ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด.
      • ๊ตฌํ˜„: ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋งŒํผ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๊ฐ€ ์ €์žฅ๋จ.
    6. char cTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‰๋ฌธ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToChar(sMunjang[iCount])๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ด.
    7. char ccTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToChar(sKeyword_Munjang[iCount])๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž๋ฅผ ๊ฐ€์ ธ์˜ด.
    8. int iTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‰๋ฌธ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToInt32(cTemp)๋ฅผ ํ†ตํ•ด ํ‰๋ฌธ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ๊ฐ€์ ธ์˜ด.
    9. int iiTemp
      • ์—ญํ• : ํ˜„์žฌ ์ฒ˜๋ฆฌ ์ค‘์ธ ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜.
      • ๊ตฌํ˜„: Convert.ToInt32(ccTemp)๋ฅผ ํ†ตํ•ด ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ž์˜ ASCII ๊ฐ’์„ ๊ฐ€์ ธ์˜ด.
    ์ฃผ์š” ํ๋ฆ„ ์„ค๋ช…
    1. ํผ ์ดˆ๊ธฐํ™” ๋ฐ Vigenere ํ…Œ์ด๋ธ” ์ƒ์„ฑ (Form1)
      • InitializeComponent()๋ฅผ ํ†ตํ•ด ํผ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
      • Vigenere ํ…Œ์ด๋ธ”์„ 26x26 ํฌ๊ธฐ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ฐ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ (button1_Click)
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ์˜ ๊ธธ์ด๋ฅผ ๋น„๊ตํ•˜์—ฌ, ํ‰๋ฌธ์ด ๋” ๊ธธ๋ฉด ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ธธ์ด๋ฅผ ๋งž์ถ”๊ณ , ํ‚ค์›Œ๋“œ๊ฐ€ ๋” ๊ธธ๋ฉด ํ‚ค์›Œ๋“œ๋ฅผ ์ž˜๋ผ์„œ ๊ธธ์ด๋ฅผ ๋งž์ถฅ๋‹ˆ๋‹ค.
      • ํ‰๋ฌธ๊ณผ ํ‚ค์›Œ๋“œ์˜ ๊ฐ ๋ฌธ์ž๋ฅผ Vigenere ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•ด ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
      • ์•”ํ˜ธํ™”๋œ ๊ฒฐ๊ณผ๋ฅผ textBox2์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    ์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์ธ Vigenere ์•”ํ˜ธํ™”๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๊ฐ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•จ์œผ๋กœ์จ ์•”ํ˜ธํ™” ๊ณผ์ • ์ „๋ฐ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜๋“ค