암호화 문자 해독하기
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"로 암호화가 되는 것이다.
복호화하는 방법은 암호화하는 방법과 반대로 수행하면 되는 Q를 A로, W를 B로 치환하는 형태로 수행하면 된다. 이 방법대로 복호화를 수행하면, 사용자가 "PGATK"를 입력하면 "JOKER"로, 사용자가 "QWER"을 입력하면 "ABCD"로 복호화되는 것이다.
참고로, 암호화하는 방법 중에 이 포스팅에서 제시한 방법처럼 치환하는 형태 또한 일반적인 암호화 방법 중 하나이며 암호화 방법 중 가장 기본적인 방법에 속한다.