카이사르 암호, 시저 암호 (Caesar cipher)
카이사르 암호는 간단한 치환 암호중 하나
특정 단어, 문장을 일정한 수만큼 밀어낸 값으로 암호 만들어냅니다..
ex) 8글자씩 밀어내는 카이사르 암호로 'HELLO CIPHER'을 암호화하면 'PMTTW KQXPMZ'가 됩니다.
▶8칸을 밀어냈으니 H는 P로 / E는M으로 / O는 T로 대응하게 되는데 CIPHER까지 치환하면 암호문이 만들어집니다.(Z에서 넘어가면 다시 A로 돌아와 B, C, D로 밀어냅니다.)
수식으로는 Enc(P) = (P + K) (mod 26) 인데
여기서 k가 가질 수 있는 수는 26개이며 0~25까지 사용할 수 있습니다.
카이사르(시저)암호의 개념에 대해 짧게 알아보았으니 프로그래밍 코드로도 알아보겠습니다. (C언어 사용)
1 #include <stdio.h>
2 void caesar_encrypt(char cipher[], int shift); //암호화할 문자열과 시프트 값을 인자로 받기
3 int main() {
4 char cipher[100]; //최대 99자리의 문자열 배열 선언
5 int key; //변수 선언
6
7 printf("암호화할 문자를 대문자로 입력해주세요: ");
8 scanf("%[^\n]", cipher);
9 printf("1~25의 암호화 키를 입력해주세요: ");
10 scanf("%d", &key);
11 caesar_encrypt(cipher, key); //함수호출
12 return 0;
13 }
배열, 변수 선언을 하고 암호화할 문자를 입력받는데 8라인에서 %[^\n]은 공백도 포함해서 문자열을 받겠다는 의미입니다.
공백없이 받으려면 그냥 %s를 사용하시면 됩니다
1 void caesar_encrypt(char cipher[], int shift) {
2 int i = 0;
3 int temp = 0;
4 while (cipher[i] != '\0') {
5 if (cipher[i] >= 'A' && cipher[i] <= 'Z') {
6 temp = cipher[i] - 'A'; //A(아스키코드 65)를 뺀 후 알파벳 인덱스 계산합니다.
7 temp = (temp + shift) % 26;
8 cipher[i] = temp + 'A'; //다시 알파벳으로 변환시킵니다.
9 }
10 i++; //다음 문자 처리를 위해 인덱스 값을 1증가 시킵니다.
11 }
12 printf("암호화 결과: %s\n", cipher);
13 }
4: 입력된 문자열의 끝을 나타내는 널 문자(\0)가 나올 떄까지 루프를 실행합니다.
5: 대문자 범위 안인지 판단합니다.
7:키 값만큼 이동한 후 26으로 나눈 나머지를 구하여 알파벳 범위를 넘지 않도록 합니다.
★ 대문자만 입력받으면 비효율적이지 않을 것 같다고 생각하실 수도 있습니다. ★
암호학적으로 보면 대,소문자 모두 다루는 것이 효율적일 수 있으나, 실제로는 보안에 취약할 수 있습니다.
영어 문장에서는 보통 대문자로 시작하는 단어가 문장의 시작을 나타내기 때문에, 가장 많이 나오는 단어인
"A"나 "She", "They" 등등 이와 같은 단어는 암호화 키를 매핑할 때 유용하게 사용될 수 있습니다.
종합해보면
#include <stdio.h>
void caesar_encrypt(char cipher[], int shift);
int main() {
char cipher[100];
int key;
printf("암호화할 문자를 대문자로 입력해주세요: ");
scanf("%[^\n]", cipher); //공백포함한 문자열 입력받기
printf("1~25의 암호화 키를 입력해주세요: "); //k값 입력받기
scanf("%d", &key);
caesar_encrypt(cipher, key); //14라인 이동
return 0;
}
void caesar_encrypt(char cipher[], int shift) {
int i = 0; //변수선언 및 초기화
int temp = 0; //변수선언 및 초기화
while (cipher[i] != '\0') { //문자열 끝날떄까지
if (cipher[i] >= 'A' && cipher[i] <= 'Z') { //A=65, Z=90 대문자 범위 파악
temp = cipher[i] - 'A'; // A에 대응하는 아스키 코드 숫자를 뺀후 인덱스 값 구하기
temp = (temp + shift) % 26;
cipher[i] = temp + 'A'; //다시 알파벳으로 변환
}
i++;
}
printf("암호화 결과: %s\n", cipher); //코드 결과 출력
}
위 코드 결과를 보면
P: HELLO CIPHER
K : 14
C : VSZZC QWDBSF
'해킹&보안 > 암호학' 카테고리의 다른 글
AES (고급 암호화 표준) (0) | 2024.05.24 |
---|---|
블록 암호 (0) | 2024.05.24 |
[아핀 암호 알고리즘] (0) | 2024.05.01 |
[곱셈 암호 알고리즘] (0) | 2024.04.30 |
[카이사르 복호화 알고리즘] (1) | 2024.03.24 |