(C/C++) 시저 암호 구현 예제 (Caesar cipher source)
이 포스트는 이전 블로그에서 이전된 포스트입니다.
암호문(Cipher Text)은 비밀을 유지하기 위해 당사자끼리만 알 수 있도록 하는 약속 기호와 같은 것입니다.
반대되는 말로는 평문(Plain Text)가 있습니다.
즉, 평문을 암호문으로 바꾸는 과정을 암호화(Encryption)이라 하고, 반대로 암호문을 평문으로 바꾸는 것을 복호화(Decryption)이라고 합니다.
이 과정에서 암호화를 수행하거나 복호화를 수행할 때 양 측에서 알고 있어야 하는 수단을 암호화 알고리즘(Encryption Algorithm)이라고 하며, 이 때 사용되는 규칙을 암호화 키(Encryption Key)라고 합니다.
이와 같은 암호화 방식 중 대체법(Substitution)이라는 방식이 글자를 다른 글자로 대체하는 암호화 방식입니다.
이는 크게 단일 치환과 다중 치환으로 나뉘는데,
단일 치환은 알파벳 한 글자를 다른 하나의 글자로 대체하는 방식으로 암호화를 수행하는 것을 의미합니다.
이 포스팅에서는 단일 치환 중에서 가장 기초적이고 간단하며 유명한 암호 방식인 시저 암호를 구현하여 볼 것입니다.
시저 암호:
시저 암호는 로마 시대에 Julius Caesar라는 사람이 군사적인 목적으로 대체법을 사용한 암호입니다.
이는 아주 간단한 단일 치환 방식으로, 알파벳을 각각 3자 혹은 4자, 5자 등으로 이동시킨 방법을 이용합니다.
즉, 모든 문자를 좌측으로 5자 이동을 기준으로 한다면
a는 f가 되고, z는 e가 되는 것입니다.
이해가 잘 안되죠? 아래 표를 보면 이해가 쉽게 될 것 입니다.
평문 |
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 |
암호문 |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
a |
b |
c |
d |
e |
즉, 위와 같은 환경에서 text라는 평문을 암호화 한다면 yjcy가 되는 것 입니다.
본격적으로 소스를 보면 아래와 같습니다.
#include <iostream>
#include <string>
using namespace std;
char caesar(char c);
int main(void)
{
string input;
string output = "";
cout << "평문을 입력한 후, Enter를 눌러주세요: ";
getline(cin,input);
for (int i = 0; i < input.length(); i++)
output += caesar(input[i]);
cout << output << endl << endl;
return 0;
}
char caesar(char c)
{
if (isupper(c))
c = (((c - 65) + 5) % 26) + 65;
else if(islower(c))
c = (((c - 97) + 5) % 26) + 97;
return c;
}
먼저, 평문을 받을 input과 암호문이 저장될 output을 선언합니다.
이후 getline을 통해 input에 평문을 받습니다.
getline을 사용한 이유는 공백도 받을 수 있기 때문입니다.
평문이 받아지면, 이후에 한 글자씩 caesar 함수로 넘겨서 작업을 수행하게 됩니다.
isupper는 대문자의 작업을 위함이며, islower는 소문자의 작업을 위해 수행됩니다.
나머지 공백 및 숫자, 특수문자등은 그대로 다시 함수에서 리턴되기 때문에 영향을 받지 않습니다.
함수 내에서 5라는 숫자는 이동한 자릿 수를 의미하며, 65와 97은 각각 대소문자의 ASCII코드 시작 번호입니다.
또한 26은 알파벳 총 갯수가 26개 이기 때문에 사용됩니다.
(알파벳의 ASCII 코드는 맨 아래에 참고용으로 첨부하겠습니다.)
예를들어 대문자 A가 함수의 인자로 넘어온다면 아래 순서로 처리되는 것입니다.
1. 65(대문자 A의 ascii값) - 65 = 0
2. 0 + 5(이동된 자릿 수) = 5
3. 5 % 26 = 5 (%는 나머지를 구합니다.)
4. 5 + 65 = 70
5. ascii 코드에서 70은 F를 의미하므로, 결과적으로 A는 F로 치환됩니다.
결과의 예제로 Text를 넣으면 아래와 같이 출력됩니다.
부록 1.
ASCII 코드 표
(이는 편의상 구글링하여 입수한 사진입니다.)