온백의 코딩 블로그

온백의 비밀 기록방

Diary/코딩 갖고 놀기

C언어로 카이사르 암호 해독기 만들기(2) 최종본

온백 hundred_100 2022. 7. 21. 14:23

어제는 진짜 정신이 나가서 못 만들었지만

결국은 만들었다.

 

어제 있던 댓글 중 하나가

'카이사르 암호가 뭐에요?' 라는 질문이 있어서 짧게 설명하고 넘어가자면

알파벳을 일정한 수 만큼 간격을 띄워서 (abcdefg -> cdefghi)

암호화 시키는 것을 말한다.


코드

어떤 문자열을 입력받으면 그 문자 하나하나를 int 타입으로 저장시켜

아스키코드로 저장시킨 다음 몇 칸씩 앞/뒤로 옮길지 설정한 대로

아스키코드를 빼거나 더해주었다.

int형으로 저장시킨 아스키코드들은 %c로 출력해주면 된다.

#include <stdio.h>

int frwd (int a, int b) {	//a: ASCII / b: cnge
	if (a == 0) {
		return 0;
	}
	
	if ((a - b) < 97) {
		b += (a - 97);
		a = (122 - b);
		
		return (a);
	}
	
	else {
		a -= b;
		
		return (a);
	}
}

int bcwd (int a, int b) {	//a: ASCII / b: cnge
	if (a == 0) {
		return 0;
	}
	
	if ((a + b) > 122) {
		b -= (123 - a);
		a = 97 + b;
		
		return (a);
	}
	
	else {
		a += b;
		
		return (a);
	}
}

int main() {
	int cnge = 0, pm = 0, N = 0;	//cnge: 얼마나 앞당길지 / pm: 앞으로, 뒤로
	
	char str[100] = { 0 };
	int ASCII[100] = { 0 };
	
	printf("암호를 얼마나 앞(1)/뒤(2) 당길지 선택 ex) 2 1 -> 2칸 앞으로: \n");
	scanf("%d %d", &cnge, &pm);
	
	printf("\n문자열을 입력하세요 (조건: Small Eng, 100, space X) \n");
	scanf("%s", str);
		
	for (int q = 0; q < 100; q++) {
		ASCII[q] = str[q];
		
		if (pm == 1) {
			ASCII[q] = frwd(ASCII[q], cnge);
		}
		else if (pm == 2) {
			ASCII[q] = bcwd(ASCII[q], cnge);
		}
		else {
			printf("\nerror");
			return 0;
		}

	}
	
	for (int q = 0; ASCII[q] >= 97 && 122 >= ASCII[q]; q++) {
		N++;
	}

	for (int q = 0; q < N; q++) {
		printf("%c", ASCII[q]);
	}
	
	
	return 0; 
}

 

일단 처음에 몇 칸씩 앞(1)/뒤(2)로 입력할 지 입력을 받아준다.

(두번 째 입력에서 1, 2 이외의 수를 입력하면 "error"가 뜬다.)

2 1		//ex

그 다음은 소문자 영어(space X, 100이하) 문자열을 입력받는다

helloworld	//ex

예시에선 1을 입력했으므로 frwd(앞으로 땡김) 함수를 실행시킨다.

bcwd(뒤로 땡김)과 frwd 함수가 별 차이는 없다.

 

ASCII[q] 와 cnge 값을 주고, ASCII를 cnge 만큼 뺴거나 더한다.

만약 'a' 나 'z'를 넘어간다면

 

b += (a - 97);    //frwd

b -= (123 - a);    //bcwd

를 한 다음 계산한다.

 

ASCII[q] != 0 일 때까지 ASCII를 문자 형태로 출력한다.

fcjjmumpjb    //ex

 

<실제 실행 결과>

 


이렇게 해서 카이사르 암호 해독기를 만들어 보았다.

(혹시 제가 발견하지 못한 오류가 있으면 댓글로 알려주시면 감사할 것 같습니다!)

 

 


다른 글 들 보기

 

2022.07.17 - [Diary/그 외 코딩 잡 지식] - 프로그래머들에게 추천하는 코딩 폰트, D2coding!

2022.07.17 - [Let's Make Series/Let's Make Drone] - 날기 위해 필요한 것 [Let's Make Drone - Epi 2]

2022.07.17 - [Let's Make Series/Let's Make Drone] - 방학 동안의 대규모(?) 프로잭트 [Let's Make Drone - Epi 1]

반응형