본문 바로가기

해킹&보안/암호학

[카이사르 암호화 알고리즘]

 

카이사르 암호, 시저 암호 (Caesar cipher)

카이사르 암호는 간단한 치환 암호중 하나 

(k = 3)

특정 단어, 문장을 일정한 수만큼 밀어낸 값으로 암호 만들어냅니다..

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