암호화 문자 해독하기

c++ 언어 사용

 

 

 

문제 : 

사용자가 입력한 암호화된 문자를 해독해서 출력하는 프로그램을 완성하시오. 

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	static char table[] = {'Q','W','E','R','T','Y','U','I','O'
		,'P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M','?'};
	char password[20];
	char encPassword[20];
	char op;

	while(1){
		cout << "암호화 할 단어를 입력하세요: ";
		cin >> password;

		cout << "\n암호화된 결과: ";
		// TO DO

		cout << "\n해독된 결과: ";
		// TO DO

		cout << "\n\n계속하시겠습니까?(y,n) ";
		cin >> op;
		if(op=='n')
			break;
	}
	return 0;
}

 

 

 

조건 :

1. 각 알파벳 문자를 암호화하기 위해 암호표를 이용한다.  
2. 암호표를 매핑 테이블에 저장한다.  
3. 매핑 테이블은 table[0] ~ table[26]을 사용해서, table[0]에는 ‘A’가 암호화한 문자, table[1]에는 B가 암호화한 문자, … 를 저장하고, A~Z 이외의 문자는 table[26]에 ‘?’로 저장한다.  (즉, ‘Q’는 ‘A’로 암호화되고, ‘M’은 ‘Z’로 암호화된다.)

 

 

 

풀이 코드 :

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	static char table[] = {'Q','W','E','R','T','Y','U','I','O'
		,'P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M','?'};
	char password[20];
	char encPassword[20];
	char op;

	while(1){
		cout << "암호화 할 단어를 입력하세요: ";
		cin >> password;

		cout << "\n암호화된 결과: ";
		for(int i=0; i<strlen(password); i++){
			int j = password[i]-'A';
			encPassword[i] = (j>26 || j<0)?table[26]:table[j];
			cout << encPassword[i];
		}

		cout << "\n해독된 결과: ";
		for(int i=0; i<strlen(password); i++){
			int j;
			int size = strlen(table)-1;
			for(j=0; j<size; j++) {
				if(encPassword[i]==table[j]) {
					cout << (char)('A' + j);
					break;
				}
				if(j==size-1)
					cout << (char)'?';
			}      
		}

		cout << "\n\n계속하시겠습니까?(y,n) ";
		cin >> op;
		if(op=='n')
			break;
	}
	return 0;
}

 

 

 

실행 결과 : 

암호화 할 단어를 입력하세요: joker

암호화된 결과: ?????
해독된 결과: ?????

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: JOKER

암호화된 결과: PGATK
해독된 결과: JOKER

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: ABCD

암호화된 결과: QWER
해독된 결과: ABCD

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: QWER

암호화된 결과: JVTK
해독된 결과: QWER

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: SSAAQ

암호화된 결과: LLQQJ
해독된 결과: SSAAQ

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: EEGGL

암호화된 결과: TTUUS
해독된 결과: EEGGL

계속하시겠습니까?(y,n) y
암호화 할 단어를 입력하세요: joker123ABC!@#$

암호화된 결과: ????????QWE????
해독된 결과: ????????ABC????

계속하시겠습니까?(y,n) n

 

 

 

풀이 설명 :

주어진 문제에 따르면, 암호화하는 메시지의 대상은 대문자만 대상인 것을 알 수 있다. 소문자, 특수문자, 숫자 등은 암호화 대상에서 제외해서 '?'라는 값으로 치환하라고 제시되어 있다. 주어진 조건에 맞게 프로그래밍을 한다면, A~Z까지의 대문자 알파벳(alphabet)에 대해서, 암호화(encrypt)를 수행했을 때 나오는 암호화된 결과값은 table 배열에 주어진 값들을 사용하면 된다. 따라서 A~Z까지의 대문자 알파벳(alphabet)을 암호화하는 것을 그림으로 나타내면 아래처럼 나타낼 수 있다.

 

암호화하는 방법은 A는 Q로 치환하고, B는 W로 치환하는 형태로 Z까지 주어진 조건에 맞게 치환하는 것이다. 이 방법대로 암호화를 수행할 때, 예를들어, 사용자가 "JOKER"라는 단어를 입력하면 이 값은 "PGATK"로 암호화되는 것이다. 같은 방법으로 사용자가 "ABCD"를 입력하면 "QWER"로 암호화가 되는 것이다.

 

[ encryption ]

 

복호화하는 방법은 암호화하는 방법과 반대로 수행하면 되는 Q를 A로, W를 B로 치환하는 형태로 수행하면 된다. 이 방법대로 복호화를 수행하면, 사용자가 "PGATK"를 입력하면 "JOKER"로, 사용자가 "QWER"을 입력하면 "ABCD"로 복호화되는 것이다. 

 

[ decryption ]

 

참고로, 암호화하는 방법 중에 이 포스팅에서 제시한 방법처럼 치환하는 형태 또한 일반적인 암호화 방법 중 하나이며 암호화 방법 중 가장 기본적인 방법에 속한다.