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 값을 인덱스로 변환.
- 함수의 흐름:
- 입력 검증: 평문과 키워드가 입력되었는지 확인.
- 평문과 키워드 길이 조정: 평문과 키워드 길이를 맞춤.
- 암호화 수행: 각 문자를 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 (블레이즈 더 비건 레이)
- 설명: 다중 알파벳 치환 암호의 한 형태로, 암호화할 때 키워드를 사용하여 평문을 여러 알파벳으로 치환합니다.
- 평문: HELLO
- 키워드: KEY
- 암호화된 텍스트: RIJVS (키워드를 반복 적용하여 각 문자마다 다른 치환을 적용)
- Vigenere 암호
- Vigenere는 약자가 아니라, 16세기 프랑스의 암호학자 Blase de Vigenère의
- 사용된 함수와 변수들의 역할
- Form1()
- 역할: 클래스 생성자. 폼을 초기화하고 Vigenere 테이블을 생성합니다.
- 구현: InitializeComponent()를 호출하여 폼의 구성 요소를 초기화하고, Vigenere 테이블을 설정합니다.
- button1_Click(object sender, EventArgs e)
- 역할: "암호화" 버튼 클릭 시 호출되는 이벤트 핸들러. 평문과 키워드를 이용해 Vigenere 암호화를 수행합니다.
- 구현: 평문과 키워드를 검증하고, 길이를 맞추고, Vigenere 테이블을 통해 암호화하여 결과를 출력합니다.
- String[,] Vigenere_Table
- 역할: Vigenere 암호화 테이블을 저장하는 2차원 배열.
- 구현: 26x26 크기의 테이블로, 알파벳 문자를 이용해 초기화됩니다.
- int iMunjang_Giri
- 역할: 평문의 길이를 저장.
- 구현: textBox1.TextLength를 통해 평문의 길이를 가져옴.
- int isKeyword_Giri
- 역할: 키워드의 길이를 저장.
- 구현: textBox4.TextLength를 통해 키워드의 길이를 가져옴.
- string[] sMunjang
- 역할: 평문의 각 문자를 저장하는 배열.
- 구현: 평문의 길이만큼 초기화되고, 평문의 각 문자가 저장됨.
- string[] sKeyword_Munjang
- 역할: 키워드의 각 문자를 저장하는 배열.
- 구현: 키워드의 길이만큼 초기화되고, 키워드의 각 문자가 저장됨.
- char cTemp
- 역할: 현재 처리 중인 평문의 문자를 저장하는 변수.
- 구현: Convert.ToChar(sMunjang[iCount])를 통해 평문의 문자를 가져옴.
- char ccTemp
- 역할: 현재 처리 중인 키워드의 문자를 저장하는 변수.
- 구현: Convert.ToChar(sKeyword_Munjang[iCount])를 통해 키워드의 문자를 가져옴.
- int iTemp
- 역할: 현재 처리 중인 평문의 문자의 ASCII 값을 저장하는 변수.
- 구현: Convert.ToInt32(cTemp)를 통해 평문의 문자의 ASCII 값을 가져옴.
- int iiTemp
- 역할: 현재 처리 중인 키워드의 문자의 ASCII 값을 저장하는 변수.
- 구현: Convert.ToInt32(ccTemp)를 통해 키워드의 문자의 ASCII 값을 가져옴.
- 폼 초기화 및 Vigenere 테이블 생성 (Form1)
- InitializeComponent()를 통해 폼의 기본 구성을 설정합니다.
- Vigenere 테이블을 26x26 크기로 초기화하고, 각 위치에 해당하는 알파벳 문자를 저장합니다.
- 버튼 클릭 이벤트 핸들러 (button1_Click)
- 평문과 키워드가 올바르게 입력되었는지 확인합니다.
- 평문과 키워드의 길이를 비교하여, 평문이 더 길면 키워드를 반복하여 길이를 맞추고, 키워드가 더 길면 키워드를 잘라서 길이를 맞춥니다.
- 평문과 키워드의 각 문자를 Vigenere 테이블을 이용해 암호화합니다.
- 암호화된 결과를 textBox2에 출력합니다.
- Form1()

[예제 2] 2차원 배열을 이용한 동음이의어 암호 구현.zip
- [예제 2] 2차원 배열을 이용한 동음이의어 암호 구현
- Vigenere이름에서 유래한 단어입니다. Vigenere 암호 (비저네어레이) 는 그가 고안한 다중 알파벳 치환 암호 기법을 의미합니다.
- 명칭 유래: Blase de Vigenère (블레이즈 더 비건 레이)
- 설명: 다중 알파벳 치환 암호의 한 형태로, 암호화할 때 키워드를 사용하여 평문을 여러 알파벳으로 치환합니다.
- 평문: HELLO
- 키워드: KEY
- 암호화된 텍스트: RIJVS (키워드를 반복 적용하여 각 문자마다 다른 치환을 적용)
- Vigenere 암호
- Vigenere는 약자가 아니라, 16세기 프랑스의 암호학자 Blase de Vigenère의
- 사용된 함수와 변수들의 역할
- Form1()
- 역할: 클래스 생성자. 폼을 초기화하고 Vigenere 테이블을 생성합니다.
- 구현: InitializeComponent()를 호출하여 폼의 구성 요소를 초기화하고, Vigenere 테이블을 설정합니다.
- button1_Click(object sender, EventArgs e)
- 역할: "암호화" 버튼 클릭 시 호출되는 이벤트 핸들러. 평문과 키워드를 이용해 Vigenere 암호화를 수행합니다.
- 구현: 평문과 키워드를 검증하고, 길이를 맞추고, Vigenere 테이블을 통해 암호화하여 결과를 출력합니다.
- String[,] Vigenere_Table
- 역할: Vigenere 암호화 테이블을 저장하는 2차원 배열.
- 구현: 26x26 크기의 테이블로, 알파벳 문자를 이용해 초기화됩니다.
- int iMunjang_Giri
- 역할: 평문의 길이를 저장.
- 구현: textBox1.TextLength를 통해 평문의 길이를 가져옴.
- int isKeyword_Giri
- 역할: 키워드의 길이를 저장.
- 구현: textBox4.TextLength를 통해 키워드의 길이를 가져옴.
- string[] sMunjang
- 역할: 평문의 각 문자를 저장하는 배열.
- 구현: 평문의 길이만큼 초기화되고, 평문의 각 문자가 저장됨.
- string[] sKeyword_Munjang
- 역할: 키워드의 각 문자를 저장하는 배열.
- 구현: 키워드의 길이만큼 초기화되고, 키워드의 각 문자가 저장됨.
- char cTemp
- 역할: 현재 처리 중인 평문의 문자를 저장하는 변수.
- 구현: Convert.ToChar(sMunjang[iCount])를 통해 평문의 문자를 가져옴.
- char ccTemp
- 역할: 현재 처리 중인 키워드의 문자를 저장하는 변수.
- 구현: Convert.ToChar(sKeyword_Munjang[iCount])를 통해 키워드의 문자를 가져옴.
- int iTemp
- 역할: 현재 처리 중인 평문의 문자의 ASCII 값을 저장하는 변수.
- 구현: Convert.ToInt32(cTemp)를 통해 평문의 문자의 ASCII 값을 가져옴.
- int iiTemp
- 역할: 현재 처리 중인 키워드의 문자의 ASCII 값을 저장하는 변수.
- 구현: Convert.ToInt32(ccTemp)를 통해 키워드의 문자의 ASCII 값을 가져옴.
- 폼 초기화 및 Vigenere 테이블 생성 (Form1)
- InitializeComponent()를 통해 폼의 기본 구성을 설정합니다.
- Vigenere 테이블을 26x26 크기로 초기화하고, 각 위치에 해당하는 알파벳 문자를 저장합니다.
- 버튼 클릭 이벤트 핸들러 (button1_Click)
- 평문과 키워드가 올바르게 입력되었는지 확인합니다.
- 평문과 키워드의 길이를 비교하여, 평문이 더 길면 키워드를 반복하여 길이를 맞추고, 키워드가 더 길면 키워드를 잘라서 길이를 맞춥니다.
- 평문과 키워드의 각 문자를 Vigenere 테이블을 이용해 암호화합니다.
- 암호화된 결과를 textBox2에 출력합니다.
- Form1()
- 함수들