재미있는 ROT13 암호화
알고리즘 문제를 풀다가 만난 ROT13이라는 암호화 기법은 그 단순함에 나의 시선을 사로잡았다. 원래 암호화 기법은 보통 사용하기가 쉽지 않고, 그 구조 또한 복잡하게 설계되어 있는 것이 보통인데, 암호화의 기본적인 안정성을 위해서 당연히 그러한 형태를 가지게 된다. ROT13은 암호화라고 부르기에는 조금 우습기도 하고, 중요한 시스템에서는 사용할 수 없는 그러한 존재임에는 분명하다. 하지만 수십 년간 명맥을 이어온 것은 아마도 그 쉬움과 단순함 때문일 것이다. 그래서 ROT13에 대해 좀 더 알아 보았다.
ROT13은 1980연대 초반에 net.jokes라는 뉴스 그룹에서 유래한 암호화 기법이라고 한다. 뉴스 그룹의 이름만 봐도 약간의 joke 형태로 시작한 방식으로 보인다. Rotate by 13이라는 의미의 ROT13은 알파벳을 13개 이동하여 치환하는 형태로 암호화된다. 예를 들어, A의 경우 13개의 문자를 왼쪽 또는 오른쪽으로 이동해 보면 N으로 바꿀 수 있다. ABC의 경우 NOP로 암호화 할 수 있다는 얘기다. 숫자는 그대로 사용한다. 아래 그림과 같이 HELLO의 경우는 URYYB로 치환된다.
이게 ROT13의 핵심이자 전부이다. 다만 영어를 제외한 다른 언어에서는 사용할 수 없는 아쉬움은 있다. 그렇다면 이 암호화는 어디에서 사용될 수 있을까.
포럼이나 커뮤니티 사이트 혹은 기사에서 스포일러가 될 수 있는 글에 대해 ROT13을 적용하여, 무심코 글을 읽다가 알려져 버릴 수 있는 글에 대해 적용한다고 한다. 나도 댓글을 읽다가 우연히 영화의 결말이나 소설의 주요한 내용을 알아 버린 적이 몇 번 있는데 그리 좋은 기억은 아니었다. 알려져도 되지만 너무 쉽게 알려져서는 안되는 것들이 ROT13의 존재의 이유가 된다.
ROT13을 c++로 구현해보았다.
string rot13(string msg)
{
string retStr;
for(size_t i=0; i<msg.size(); i++)
{
char c = msg.at(i);
char checkC;
if((c >= 'A' && c <= 'M') || (c >= 'a' && c <= 'm'))
{
checkC = c + 13;
retStr.push_back(checkC);
}
else if( (c >= 'N' && c <= 'Z') || (c >= 'n' && c <= 'z'))
{
checkC = c - 13;
retStr.push_back(checkC);
}
else
retStr.push_back(c);
}
return retStr;
}
A~M/a~m 캐릭터 문자의 경우 +13을, N~Z/n~z에 대해선 -13을 적용하여 치환된 string을 얻는 함수이다. 구현도 암호화 기법처럼 단순하다.
암호화라는 무거운 주제를 달고 태어나 그 단순함으로 필요한 역할을 해내는 것을 보면 쉬움이라는 것이 어떻게 보면 생명력과 강력하게 직결되어 있는 것 같다.