카이사르 암호(Caesar Cipher)는 단일 문자 치환 암호(mono-alphabetic cipher)의 한 종류로, 평문(plaintext)의 각 알파벳을 다른 알파벳으로 치환하여 암호문(ciphertext)을 만드는 방식입니다. 치환 암호 기법 중에서도 가장 단순한 형태에 해당합니다.
이 암호 시스템은 흔히 시프트 암호(Shift Cipher)라고도 불립니다. 핵심 원리는 각 알파벳을 0부터 25 사이의 고정된 값만큼 '이동(shift)'시킨 다른 알파벳으로 바꾸는 것입니다.
이 방식에서는 송신자와 수신자가 사전에 알파벳을 이동시킬 '비밀 이동 값(secret shift number)'을 합의해야 합니다. 이 0~25 사이의 숫자가 곧 암호화 키(key)가 됩니다.
참고로 '카이사르 암호'라는 명칭은 이동 값을 3으로 사용하는 시프트 암호를 지칭할 때 자주 쓰입니다.
암호화·복호화 과정
평문의 첫 글자를 암호화하기 위해 송신자는 슬라이딩 자(sliding ruler)를 평문 아래에 놓고, 합의된 비밀 이동 값만큼 왼쪽으로 밀어냅니다.
그런 다음 평문 문자는 슬라이딩 자 아래에 정렬된 암호문 문자로 변환됩니다. 예를 들어 이동 값이 3으로 합의된 경우, 평문 'tutorial'은 암호문 'wxwruldo'로 암호화됩니다. 이동 값이 3일 때의 암호문 알파벳 배열은 다음과 같습니다.

암호문을 전달받은 수신자 역시 비밀 이동 값을 알고 있기 때문에, 슬라이딩 자를 암호문 알파벳 아래에 놓고 합의된 이동 값(여기서는 3)만큼 오른쪽으로 밀어 위치를 맞춥니다.
이후 암호문 문자를 슬라이딩 자 아래의 평문 문자로 되돌리면 복호화가 완료됩니다. 즉, 암호문 'wxwruldo'는 'tutorial'로 해독됩니다. 이동 값 3으로 암호화된 메시지를 복호화하려면 아래처럼 '-3' 이동으로 평문 알파벳을 만들면 됩니다.

위 과정을 C++로 구현한 내용을 살펴보겠습니다.
구현 단계 및 의사코드
먼저 메시지와 키를 입력값으로 받습니다.
암호화
- 입력: tutorial
- 출력: wxwruldo
복호화
- 입력: wxwruldo
- 출력: tutorial
암호화 의사코드
Begin
For i = 0 to msg[i] != '\0'
ch = msg[i]
// 소문자 암호화
If (ch >= 'a' and ch <= 'z')
ch = ch + key
if (ch > 'z')
ch = ch - 'z' + 'a' - 1
done
msg[i] = ch
// 대문자 암호화
else if (ch >= 'A' and ch <= 'Z')
ch = ch + key
if (ch > 'Z')
ch = ch - 'Z' + 'A' - 1
done
msg[i] = ch
done
done
Print Encrypted message
End
복호화 의사코드
Begin
For i = 0 to msg[i] != '\0'
ch = msg[i]
// 소문자 복호화
if(ch >= 'a' and ch <= 'z')
ch = ch - key
if (ch < 'a')
ch = ch + 'z' - 'a' + 1
done
msg[i] = ch
// 대문자 복호화
else if (ch >= 'A' and ch <= 'Z')
ch = ch - key
if (ch < 'A')
ch = ch + 'Z' - 'A' + 1
done
msg[i] = ch
done
done
Print decrypted message
End
C++ 전체 예제 코드
#include<iostream>
#include<string.h>
using namespace std;
int main() {
cout<<"Enter the message:\n";
char msg[100];
cin.getline(msg,100); // 메시지 입력 받기
int i, j, length, choice, key;
cout << "Enter key: ";
cin >> key; // 키 입력 받기
length = strlen(msg);
cout<<"Enter your choice \n1. Encryption \n2. Decryption \n";
cin>>choice;
if (choice==1) { // 암호화
char ch;
for(int i = 0; msg[i] != '\0'; ++i) {
ch = msg[i];
// 소문자 암호화
if (ch >= 'a' && ch <= 'z'){
ch = ch + key;
if (ch > 'z') {
ch = ch - 'z' + 'a' - 1;
}
msg[i] = ch;
}
// 대문자 암호화
else if (ch >= 'A' && ch <= 'Z'){
ch = ch + key;
if (ch > 'Z'){
ch = ch - 'Z' + 'A' - 1;
}
msg[i] = ch;
}
}
printf("Encrypted message: %s", msg);
}
else if (choice == 2) { // 복호화
char ch;
for(int i = 0; msg[i] != '\0'; ++i) {
ch = msg[i];
// 소문자 복호화
if(ch >= 'a' && ch <= 'z') {
ch = ch - key;
if(ch < 'a'){
ch = ch + 'z' - 'a' + 1;
}
msg[i] = ch;
}
// 대문자 복호화
else if(ch >= 'A' && ch <= 'Z') {
ch = ch - key;
if(ch < 'A') {
ch = ch + 'Z' - 'A' + 1;
}
msg[i] = ch;
}
}
cout << "Decrypted message: " << msg;
}
}
실행 결과
For encryption: Enter the message: tutorial Enter key: 3 Enter your choice 1. Encryption 2. Decryption 1 Encrypted message: wxwruldo For decryption: Enter the message: wxwruldo Enter key: 3 Enter your choice 1. Encryption 2. Decryption 2 Decrypted message: tutorial