#include<stdio.h>
int decoder_key(int key);
int main()
{
char str[1024]; //파일의 문장을 담을 문자열
int as; // 아스키 값을 담을 변수
char c; // 아스키 값을 문자로
int input_value;
int en_key;
int de_key;
int select;
while (1)
{
printf("===============================\n");
printf("0. 종 료\n");
printf("1. 암호화\n");
printf("2. 복호화\n");
printf("===============================\n");
printf("입력 : ");
scanf("%d", &select);
if(select == 0)
{
printf("프로그램을 종료합니다.\n");
return 0;
}
else if (select == 1)
{
en_back:
// 1~26까지 대입해서 암호화, 다른 값을 입력하면 다시 입력
printf("===============================\n");
printf("암호화할 키 값 입력(1~26):");
scanf("%d", &input_value);
if (input_value < 1 || input_value >26)
{
printf("1~26으로 다시 입력하세요.\n\n");
goto en_back;
}
en_key = input_value;
FILE *fp1, *fp2;
// ./ <- 현재 디렉토리위치
fp1 = fopen("./\\Test_file.txt", "r");
fp2 = fopen("./\\Encrypted_Test_file.txt", "w");
while (1)
{
// 파일의 값이 마지막 위치라면 반복문 종료
// 종료를 안하면 무한으로 줄바꿈 현상
if (feof(fp1))
{
break;
}
// 메모장의 문자열을 한문장씩 읽어서 str문자열에 저장
fgets(str, sizeof(str), fp1);
// 가져온 문자열로 인코딩 하기
for (int i = 0; i < sizeof(str); i++)
{
// str[i]가 소문자 알파벳일때
if (str[i] >= 'a' && str[i] <= 'z')
{
as = str[i];
as = as - 97 + en_key;
as = as % 26;
as = as + 97;
c = as;
str[i] = c;
}
// str[i]가 대문자 알파벳일때
else if (str[i] >= 'A' && str[i] <= 'Z')
{
as = str[i];
as = as - 65 + en_key;
as = as % 26;
as = as + 65;
c = as;
str[i] = c;
}
}
printf("%s", str);
fputs(str, fp2);
}
fclose(fp1, fp2);
return 0;
}
else if (select == 2)
{
de_back:
// 1~26까지 대입해서 복호화, 다른 값을 입력하면 다시 입력
printf("복호화할 키 값 입력:");
scanf("%d", &input_value);
if (input_value < 1 || input_value >26)
{
printf("1~26으로 다시 입력하세요.\n\n");
goto de_back;
}
// 디코딩 키 값을 추출하는 함수
de_key = decoder_key(input_value);
FILE *fp3, *fp4;
// ./ <- 현재 디렉토리위치
fp3 = fopen("./\\Encrypted_Test_file.txt", "r");
fp4 = fopen("./\\Decoder_Test_file.txt", "w");
while (1)
{
// 파일의 값이 마지막 위치라면 반복문 종료
// 종료를 안하면 무한으로 줄바꿈 현상
if (feof(fp3))
{
break;
}
// 메모장의 문자열을 한문장씩 읽어서 str문자열에 저장
fgets(str, sizeof(str), fp3);
// 가져온 문자열로 디코딩(복호화) 하기
for (int i = 0; i < sizeof(str); i++)
{
// str[i]가 소문자 알파벳일때
if (str[i] >= 'a' && str[i] <= 'z')
{
as = str[i];
as = as - 97 + de_key;
as = as % 26;
as = as + 97;
c = as;
str[i] = c;
}
// str[i]가 대문자 알파벳일때
else if (str[i] >= 'A' && str[i] <= 'Z')
{
as = str[i];
as = as - 65 + de_key;
as = as % 26;
as = as + 65;
c = as;
str[i] = c;
}
}
printf("%s", str);
fputs(str, fp4);
}
fclose(fp3, fp4);
return 0;
}
else
{
// select 0,1,2외의 값
printf("\n잘못된 키를 입력하셨습니다.\n다시 입력하세요\n");
continue;
}
}
return 0;
}
int decoder_key(int key)
{
// 디코딩은 키 값이 왼쪽으로 이동하기 때문에
// 오른쪽으로 이동해서 한바퀴를 돌 수 있는 값을 넣었습니다.
switch (key)
{
case 1: key = key + 24; break;
case 2: key = key + 22; break;
case 3: key = key + 20; break;
case 4: key = key + 18; break;
case 5: key = key + 16; break;
case 6: key = key + 14; break;
case 7: key = key + 12; break;
case 8: key = key + 10; break;
case 9: key = key + 8; break;
case 10: key = key + 6; break;
case 11: key = key + 4; break;
case 12: key = key + 2; break;
case 13: key = key + 0; break;
case 14: key = key - 2; break;
case 15: key = key - 4; break;
case 16: key = key - 6; break;
case 17: key = key - 8; break;
case 18: key = key - 10; break;
case 19: key = key - 12; break;
case 20: key = key - 14; break;
case 21: key = key - 16; break;
case 22: key = key - 18; break;
case 23: key = key - 20; break;
case 24: key = key - 22; break;
case 25: key = key - 24; break;
case 26: key = key - 26; break;
}
return key;
}