Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 구현하는 카이사르 암호(Caesar Cipher): 원리부터 코드까지

카이사르 암호(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일 때의 암호문 알파벳 배열은 다음과 같습니다.

C++로 구현하는 카이사르 암호(Caesar Cipher): 원리부터 코드까지

  • 암호문을 전달받은 수신자 역시 비밀 이동 값을 알고 있기 때문에, 슬라이딩 자를 암호문 알파벳 아래에 놓고 합의된 이동 값(여기서는 3)만큼 오른쪽으로 밀어 위치를 맞춥니다.

  • 이후 암호문 문자를 슬라이딩 자 아래의 평문 문자로 되돌리면 복호화가 완료됩니다. 즉, 암호문 'wxwruldo'는 'tutorial'로 해독됩니다. 이동 값 3으로 암호화된 메시지를 복호화하려면 아래처럼 '-3' 이동으로 평문 알파벳을 만들면 됩니다.

C++로 구현하는 카이사르 암호(Caesar Cipher): 원리부터 코드까지

위 과정을 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