2024. 6. 12. 11:58ใDevelopment๐ฉ๐ป๐ฆณ/C#
์ํธํ์ ํ์์ฑ ๋ฐ ์ฉ๋ ( Necessity and purpose of encryption )
๊ณต์ ์๋ํ์์ ์ํธํ ๋ฐ ๋ฐ์ดํฐ ์๊ธฐ ๊ธฐ์ ์ ๋ฐ์ดํฐ ๋ณดํธ, ์์ ํ ํต์ , ํ๋ก์ธ์ค ๋ณด์ ๋ฑ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
1. ๋ฐ์ดํฐ ๋ณดํธ ๋ฐ ๊ธฐ๋ฐ์ฑ ์ ์ง
- ์์ฐ ๋ฐ์ดํฐ ๋ณดํธ: ์์ฐ๋, ๊ณต์ ์๊ฐ, ํ์ง ๊ฒ์ฌ ๊ฒฐ๊ณผ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๋ณดํธ.
- ๊ธฐ๊ณ ๊ฐ ์์ ํ ํต์ : ๊ธฐ๊ณ ๊ฐ ํต์ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ๋์ฒญ ๋ฐฉ์ง.
2. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฐ ์ธ์ฆ
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ: ๋ฐ์ดํฐ ์ ์ก ์ค ๋ณ์กฐ ์ฌ๋ถ ํ์ธ.
- ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ ๊ทผ ์ ์ด: ์ฌ์ฉ์ ์ธ์ฆ ์ ์ํธํ๋ ํ ํฐ ์ฌ์ฉ.
3. ํ๋ก์ธ์ค ๋ณด์ ๋ฐ ์ด์ ๊ฐ์ง
- ํ๋ก์ธ์ค ๋ณด์ ๊ฐํ: ์ํธํ๋ ๋ช ๋ น์ด๋ก ํน์ ํ๋ก์ธ์ค ๋ณดํธ.
- ์ด์ ๊ฐ์ง ์์คํ : ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ํตํด ๋น์ ์ ํ๋ ํ์ง.
4. ๊ณต๊ธ๋ง ๋ณด์
- ๊ณต๊ธ๋ง ๋ด ๋ฐ์ดํฐ ๋ณดํธ: ๊ณต๊ธ๋ง ์ ์ฒด์์ ๋ฐ์ดํฐ ์ํธํ.
5. ์๊ฒฉ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ด
- ์๊ฒฉ ์ ์ด ์์คํ ๋ณดํธ: ์๊ฒฉ ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ด ์ ๋ฐ์ดํฐ ์ํธํ.
์ํธํ ๋ฐฉ์
ํ์ฌ ๊ตฌํ๋ ์ํธํ ๋ฐฉ์์ ๊ธฐ๋ณธ์ ์ธ ๋จ์ ์นํ ์ํธํ์ ๋๋ค. ์ด๋ ๊ฐ ๋ฌธ์๋ฅผ ํน์ ๊ท์น์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฌธ์๋ก ๋์ฒดํ๋ ๋ฐฉ์์ ๋๋ค. ํฅํ ๋ค์ค ์นํ ์ํธํ, ๋ธ๋ก ์ํธํ, ๋์นญ ํค ์ํธํ, ๋น๋์นญ ํค ์ํธํ, ์์ ์ํธํ ๋ฑ์ ๊ณ ๊ธ ์ํธํ ๊ธฐ๋ฒ ๋์ ์ด ํ์ํฉ๋๋ค.
ASCII ์ฝ๋๋ฅผ ์ด์ฉํ ๊ฐ๋จํ ์ํธํ ์์
ASCII ์ฝ๋๋ฅผ ํ์ฉํ ์ํธํ๋ ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ณํํ๋ ๊ธฐ๋ณธ์ ์ธ ๊ณผ์ ์ ํตํด ์ํธํ์ ๊ธฐ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์ ์ฝ๋: C#
csharp์ฝ๋ ๋ณต์ฌ
char c = 'A'; // ๋ฌธ์ 'A'
int asciiValue = (int)c; // ASCII ์ฝ๋ ๊ฐ 65
char newChar = (char)asciiValue; // ๋ค์ ๋ฌธ์ 'A'๋ก ๋ณํ
Console.WriteLine(asciiValue); // ์ถ๋ ฅ: 65
Console.WriteLine(newChar); // ์ถ๋ ฅ: A
ํต์ฌ ๊ตฌํ ๊ณผ์ ์์ฝ
1. ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ
csharp์ฝ๋ ๋ณต์ฌ
if (textBox1.Text == "") { /* ๊ฒฝ๊ณ 1 */ }
if (textBox4.Text == "") { /* ๊ฒฝ๊ณ 2 */ }
if (textBox5.Text == "") { /* ๊ฒฝ๊ณ 3 */ }
if (int.Parse(textBox4.Text) < 2 || int.Parse(textBox4.Text) > 7) { /* ๊ฒฝ๊ณ 4 */ }
if (int.Parse(textBox4.Text) != textBox5.Text.Length) { /* ๊ฒฝ๊ณ 5 */ }
2. ์์ ์์ ์ ํจ์ฑ ๊ฒ์ฌ
csharp์ฝ๋ ๋ณต์ฌ
for (int j = 0; j < iCutting_Giri; j++) {
int iTemp = Convert.ToInt16(sSunceo[j]);
if (iTemp < 1 || iTemp > iCutting_Giri) { /* ๊ฒฝ๊ณ 6 */ }
for (int k = j + 1; k < iCutting_Giri; k++) {
if (sSunceo[j] == sSunceo[k]) { /* ๊ฒฝ๊ณ 7 */ }
}
}
// Check for three consecutive numbers in sequence
bool consecutiveFound = false;
for (int i = 0; i < iCutting_Giri - 2; i++) {
int a = Convert.ToInt16(sSunceo[i]);
int b = Convert.ToInt16(sSunceo[i + 1]);
int c = Convert.ToInt16(sSunceo[i + 2]);
if ((b == a + 1 && c == b + 1) || (b == a - 1 && c == b - 1)) {
consecutiveFound = true;
break;
}
}
if (consecutiveFound) {
/* ๊ฒฝ๊ณ 9 */
}
3. ๋ฌธ์์ด์ ์ ์๋ก ๋ณํ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
csharp์ฝ๋ ๋ณต์ฌ
for (int iCount = 0; iCount < iMunjang_Giri; iCount++) {
sTemp = textBox1.Text.Substring(iCount, 1);
char cTemp = Convert.ToChar(sTemp);
int iTemp = Convert.ToInt32(cTemp);
if (iTemp < 97 || (iTemp > 122 && iTemp < 40000)) { /* ๊ฒฝ๊ณ 10 */ }
}
4. ํจ๋ฉ ์์
csharp์ฝ๋ ๋ณต์ฌ
if (iMunjang_Giri % iCutting_Giri != 0) {
int iPadding_Giri = iCutting_Giri - (iMunjang_Giri % iCutting_Giri);
sTemp = textBox1.Text.Substring(iMunjang_Giri - 1, 1);
char cTemp = Convert.ToChar(sTemp);
int iTemp = Convert.ToInt32(cTemp);
if (iTemp > 96 && iTemp < 123)
textBox1.Text += sEng_Pad.Substring(0, iPadding_Giri);
else
textBox1.Text += sKor_Pad.Substring(0, iPadding_Giri);
}
5. ๋ฌธ์์ด ์๊ธฐ ๋ฐ ์ํธ๋ฌธ ์์ฑ
csharp์ฝ๋ ๋ณต์ฌ
for (int j = 0; j < iMunjang_Giri; j += iCutting_Giri) {
for (int k = 0; k < iCutting_Giri; k++)
sTempArray[k] = sMunjang[j + k];
for (int y = 0; y < iCutting_Giri; y++)
sMunjang[j + y] = sTempArray[Convert.ToInt16(sSunceo[y]) - 1];
}
textBox2.Text = "";
for (int iCount = 0; iCount < iMunjang_Giri; iCount++) {
char cTemp = Convert.ToChar(sMunjang[iCount]);
int iTemp = Convert.ToInt32(cTemp);
if (iTemp > 96 && iTemp < 123)
textBox2.Text += Convert.ToChar(iTemp - (97 - 65));
else
textBox2.Text += sMunjang[iCount];
}
์ํธํ ์์ ์ฝ๋
csharp์ฝ๋ ๋ณต์ฌ
using System;
using System.Text;
public class SimpleEncryption {
public static string Encrypt(string plainText, string key) {
char[] chars = plainText.ToCharArray();
int[] order = Array.ConvertAll(key.ToCharArray(), c => (int)char.GetNumericValue(c) - 1);
StringBuilder encrypted = new StringBuilder();
for (int i = 0; i < chars.Length; i += order.Length) {
char[] segment = new char[order.Length];
for (int j = 0; j < order.Length; j++) {
if (i + j < chars.Length) {
segment[order[j]] = chars[i + j];
} else {
segment[order[j]] = ' '; // Padding with spaces
}
}
encrypted.Append(segment);
}
return encrypted.ToString();
}
public static void Main() {
string plainText = "hellothere";
string key = "312";
string encryptedText = Encrypt(plainText, key);
Console.WriteLine("Encrypted: " + encryptedText);
}
}
ํดํน(๋ณตํธํ) ์ฝ๋ ์์
csharp์ฝ๋ ๋ณต์ฌ
using System;
using System.Text;
public class SimpleDecryption {
public static string Decrypt(string encryptedText, string key) {
char[] chars = encryptedText.ToCharArray();
int[] order = Array.ConvertAll(key.ToCharArray(), c => (int)char.GetNumericValue(c) - 1);
int[] reverseOrder = new int[order.Length];
// Creating reverse order
for (int i = 0; i < order.Length; i++) {
reverseOrder[order[i]] = i;
}
StringBuilder decrypted = new StringBuilder();
for (int i = 0; i < chars.Length; i += order.Length) {
char[] segment = new char[order.Length];
for (int j = 0; j < order.Length; j++) {
if (i + j < chars.Length) {
segment[j] = chars[i + reverseOrder[j]];
}
}
decrypted.Append(segment);
}
return decrypted.ToString();
}
public static void Main() {
string encryptedText = "elho htleer"; // Encrypted form of "hellothere" with key "312"
string key = "312";
string decryptedText = Decrypt(encryptedText, key);
Console.WriteLine("Decrypted: " + decryptedText);
}
}
์ฝ๋ ์ค๋ช
- Encrypt ํจ์:
- ํ๋ฌธ(plainText)๊ณผ ํค(key)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ํธํ๋ ํ ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
- ํค๋ฅผ ํตํด ๋ฌธ์์ ์์๋ฅผ ๊ฒฐ์ ํ๊ณ , ํด๋น ์์์ ๋ง์ถฐ ๋ฌธ์๋ฅผ ์ฌ๋ฐฐ์ดํฉ๋๋ค.
- ๋ฌธ์ ๊ธธ์ด๋ณด๋ค ์งง์ ๊ฒฝ์ฐ ๊ณต๋ฐฑ์ผ๋ก ํจ๋ฉํฉ๋๋ค.
- Decrypt ํจ์:
- ์ํธํ๋ ํ ์คํธ(encryptedText)์ ํค(key)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ณตํธํ๋ ํ ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
- ํค๋ฅผ ํตํด ๋ฌธ์์ ์๋ ์์๋ฅผ ๊ฒฐ์ ํ๋ reverseOrder ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
- ์๋ ์์์ ๋ฐ๋ผ ๋ฌธ์๋ฅผ ์ฌ๋ฐฐ์ดํ์ฌ ๋ณตํธํ๋ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
ASCII ์ฝ๋ ํ์ฉ
- Convert.ToInt16 ๋ฐ char.GetNumericValue๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ซ์๋ก ๋ณํํฉ๋๋ค.
- StringBuilder๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ์กฐ๋ฆฝํฉ๋๋ค.
์ฅ๋จ์
์ฅ์
- ๊ฐ๋จํ ์ดํด: ๊ธฐ๋ณธ์ ์ธ ์ํธํ ๋ฐ ๋ณตํธํ ๊ฐ๋ ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
- ASCII ์ฝ๋ ํ์ฉ: ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ ์ ์์ต๋๋ค.
๋จ์
- ๋ณด์ ์์ค ๋ฎ์: ๋งค์ฐ ๋จ์ํ ์ํธํ ๋ฐฉ๋ฒ์ผ๋ก, ํ๋์ ์ธ ๋ณด์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ง ๋ชปํฉ๋๋ค.
- ์ค์ ์ ์ฉ์ ํ๊ณ: ํ์ต ๋ชฉ์ ์ธ์ ์ค๋ฌด์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
๋นํจ์จ์ฑ ๋ฐ ๊ฐ์ ์
- goto ๋ฌธ ์ฌ์ฉ: ์ ์ด ๊ตฌ์กฐ๋ฅผ ํตํด ์์ธ ์ฒ๋ฆฌ ๊ฐ์ .
- ์์ ๊ฒ์ฌ: ์ค๋ณต ๊ฒ์ฌ๋ฅผ ์ต์ํ.
- ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฌ: ํจ์๋ฅผ ํตํ ์ฝ๋ ๊ฐ๊ฒฐํ.
- ํ๋์ฝ๋ฉ๋ ํจ๋ฉ ๋ฌธ์: ์ ์ฐ์ฑ ์ฆ๋.
๊ฐ์ ๋ ์์: Strategy ํจํด ์ ์ฉ
์ธํฐํ์ด์ค ์ ์
csharp์ฝ๋ ๋ณต์ฌ
public interface IEncryptionStrategy {
string Encrypt(string plainText, int segmentLength, string shuffleOrder);
}
๋จ์ ์ ์น ์ํธํ ์ ๋ต ๊ตฌํ
csharp์ฝ๋ ๋ณต์ฌ
public class SimpleTranspositionEncryption : IEncryptionStrategy {
public string Encrypt(string plainText, int segmentLength, string shuffleOrder) {
// ํจ๋ฉ ์ฒ๋ฆฌ
plainText = PadPlainText(plainText, segmentLength);
// ํ๋ฌธ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋
string[] segments = SplitTextIntoSegments(plainText, segmentLength);
// ์ธ๊ทธ๋จผํธ๋ฅผ ์์
string[] shuffledSegments = ShuffleSegments(segments, shuffleOrder);
// ์ํธ๋ฌธ ์์ฑ
return CreateCipherText(shuffledSegments);
}
private string PadPlainText(string plainText, int segmentLength) {
int paddingLength = segmentLength - (plainText.Length % segmentLength);
if (paddingLength < segmentLength) {
char paddingChar = plainText[plainText.Length - 1] < 128 ? 'x' : 'ํ';
plainText += new string(paddingChar, paddingLength);
}
return plainText;
}
private string[] SplitTextIntoSegments(string text, int segmentLength) {
int segmentCount = text.Length / segmentLength;
string[] segments = new string[segmentCount];
for (int i = 0; i < segmentCount; i++) {
segments[i] = text.Substring(i * segmentLength, segmentLength);
}
return segments;
}
private string[] ShuffleSegments(string[] segments, string shuffleOrder) {
string[] shuffledSegments = new string[segments.Length];
for (int i = 0; i < segments.Length; i++) {
char[] shuffledSegment = new char[segments[i].Length];
for (int j = 0; j < segments[i].Length; j++) {
shuffledSegment[j] = segments[i][shuffleOrder[j] - '1'];
}
shuffledSegments[i] = new string(shuffledSegment);
}
return shuffledSegments;
}
private string CreateCipherText(string[] segments) {
string cipherText = string.Join("", segments);
return cipherText.ToUpper();
}
}
Form1 ํด๋์ค์ ์์
csharp์ฝ๋ ๋ณต์ฌ
public partial class Form1 : Form {
private IEncryptionStrategy encryptionStrategy;
public Form1() {
InitializeComponent();
encryptionStrategy = new SimpleTranspositionEncryption();
}
private void buttonEncrypt_Click(object sender, EventArgs e) {
if (IsValidInput()) {
string cipherText = encryptionStrategy.Encrypt(
textBoxPlain.Text,
int.Parse(textBoxSegmentLength.Text),
textBoxShuffleOrder.Text
);
textBoxCipher.Text = cipherText;
}
}
private bool IsValidInput() {
if (string.IsNullOrEmpty(textBoxPlain.Text)) {
ShowError("ํ๋ฌธ์ ์
๋ ฅํ๊ณ ๋ฒํผ์ ๋๋ฅด์ธ์.", "[ ๊ฒฝ๊ณ 1 ]");
textBoxPlain.Focus();
return false;
}
if (string.IsNullOrEmpty(textBoxSegmentLength.Text)) {
ShowError("๋๋ ๊ธธ์ด๋ฅผ ์
๋ ฅํ๊ณ ์ ๋ฒํผ์ ๋๋ฅด์ธ์.", "[ ๊ฒฝ๊ณ 2 ]");
textBoxSegmentLength.Focus();
return false;
}
if (string.IsNullOrEmpty(textBoxShuffleOrder.Text)) {
ShowError("์์ ์์๋ฅผ ์
๋ ฅํ๊ณ ์ ๋ฒํผ์ ๋๋ฅด์ธ์.", "[ ๊ฒฝ๊ณ 3 ]");
textBoxShuffleOrder.Focus();
return false;
}
if (!int.TryParse(textBoxSegmentLength.Text, out int segmentLength) || segmentLength < 2 || segmentLength > 7) {
ShowError("๋๋ ๊ธธ์ด๋ 2~7 ์ฌ์ด์ ๊ฐ์
๋๋ค.", "[ ๊ฒฝ๊ณ 4 ]");
textBoxSegmentLength.Focus();
textBoxSegmentLength.SelectAll();
return false;
}
if (textBoxShuffleOrder.Text.Length != segmentLength) {
ShowError("๋๋ ๊ธธ์ด์ ์์ ์์์ ๊ธธ์ด๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.", "[ ๊ฒฝ๊ณ 5 ]");
textBoxShuffleOrder.Focus();
textBoxShuffleOrder.SelectAll();
return false;
}
if (!IsValidShuffleOrder(textBoxShuffleOrder.Text, segmentLength)) {
return false;
}
return true;
}
private void ShowError(string message, string title) {
MessageBox.Show(message, title);
}
private bool IsValidShuffleOrder(string shuffleOrder, int segmentLength) {
bool[] isUsed = new bool[segmentLength];
for (int i = 0; i < segmentLength; i++) {
if (!int.TryParse(shuffleOrder[i].ToString(), out int order) || order < 1 || order > segmentLength) {
ShowError("์์ ์์๋ 1๋ณด๋ค ์๊ฑฐ๋ ๋๋ ๊ธธ์ด๋ณด๋ค ํด ์ ์์ต๋๋ค.", "[ ๊ฒฝ๊ณ 6 ]");
textBoxShuffleOrder.Focus();
textBoxShuffleOrder.SelectionStart = i;
textBoxShuffleOrder.SelectionLength = 1;
return false;
}
if (isUsed[order - 1]) {
ShowError("๋์ผํ ์์๊ฐ ๋๋ฒ ์
๋ ฅ๋์์ต๋๋ค", "[ ๊ฒฝ๊ณ 7 ]");
textBoxShuffleOrder.Focus();
textBoxShuffleOrder.SelectionStart = i;
textBoxShuffleOrder.SelectionLength = 1;
return false;
}
isUsed[order - 1] = true;
}
return true;
}
}
์ด ์ ๊ทผ ๋ฐฉ์์ ์ํธํ ๊ฐ๋ ์ ๊ธฐ์ด๋ฅผ ์ดํดํ๋ ๋ฐ ์ ์ฉํ์ง๋ง, ์ค์ ๋ณด์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ ๊ฐ๋ ฅํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํฉ๋๋ค.