Computer/Algorithm
Daily Algorithm - 암호 해독하기
kentakang
2018. 1. 22. 23:41
반응형
문제
암호학에서 씨저 암호(Caesar cipher)는 가장 오래된 암호 중 하나이고,
가장 대표적인 대치(substitution) 암호로서 평문 문자를 다른 문자로 일대일 대응시켜 암호문을 만들어 낸다.
씨저 암호는 알파벳을 3글자씩 밀려서 쓰면서 문장을 만들었다.
실제 씨저는 부하인 브루투스에게 암살되기 전에 키케로에게 다음과 같은 암호문을 보냈다고 한다.
qhyhu wuxvw euxwxv (암호문)
===> never trust brutus (원문)
암호문을 원문으로 해독하는 원리는 간단하다. 암호문에 쓰인 알파벳 보다 3작은 알파벳으로 치환하면 된다.
암호 : a b c d e f g h i j k l m n o p q r s t u v w x y z
평문 : x y z a b c d e f g h i j k l m n o p q r s t u v w
씨저의 암호문이 입력되면 원문으로 해독하는 프로그램을 작성하시오.
입력
씨저의 암호문이 입력된다.
입력에서는 반드시 영어 소문자와 공백만 입력되고, 다른 문자는 입력되지 않는다.
입력되는 문자열의 길이는 200자를 넘지 않는다.
출력
암호문을 원문으로 해독한 문장이 출력된다.
예제 입력
qhyhu wuxvw euxwxv
예제 출력
never trust brutus
풀이
#include <stdio.h>
#include <string.h>
int main() {
char password[200] = { 0, };
fgets(password, 200, stdin);
for (int i = 0; i < strlen(password); i++) {
if (password[i] >= 'A' && password[i] <= 'Z') {
password[i] -= 'A';
if(password[i] - 3 < 0) {
password[i] += 26;
}
password[i] = (password[i] - 3) % 26;
password[i] += 'A';
}
if (password[i] >= 'a' && password[i] <= 'z') {
password[i] -= 'a';
if (password[i] - 3 < 0) {
password[i] += 26;
}
password[i] = (password[i] - 3) % 26;
password[i] += 'a';
}
}
printf("%s\n", password);
return 0;
}
반응형