본문 바로가기
C/암호학

Caesar Cipher[C]

by 덤더리덤떰 2023. 9. 1.

1. 카이사르 암호

: 고전 암호 알고리즘으로 평문 문자를 다른 문자로 일대일 대응시켜 암호문을 만들어내는 방식

: 모듈 이용 

: Brute-Froce 알고리즘에는 취약함

1.1 카이사르 암호 알고리즘 구현

1) 고려해야하는 점

  • (암호화) 키를 적용했을 때 범위를 벗어나는 것(모듈러 값을 초과)을 방지하기위해 순환시킨다

  • (복호화) 키를 적용했을 때 범위를 벗어나는 경우(음수가 되는 경우) 26을 더해준다

-> 이때 mod26을 하는 건 어떤 숫자를 0~25의 범위의 숫자로 만드는 과정이기에 (26이상의 자연수)-26을 하는 것이라 생각할 수 있다(물론, 26보다 한참 큰 숫자는 -26한 결과와 %26한 결과는 다르다)

-> 그렇다면 음수가 되어 범위를 벗어나는 경우엔 (0미만의 정수)+26을 하여 0~25의 범위의 숫자로 만든다고 생각

(전제조건: key값이 26보다 작아야함)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

void Caesar(char* str, int key) {
	int len = strlen(str);
	
	for (int i = 0; i < len; i++) {
		if (str[i] >= 'a' && str[i] <= 'z') {
			str[i]=str[i] - 'a';
			
			if (str[i]+key< 0) {
				str[i] += 26;
			}
			str[i] += key;
			str[i] %= 26;
			str[i] += 'a';
			
		}
		else if (str[i] >= 'A' && str[i] <= 'Z') {
			str[i] = str[i] - 'A';
			
			if (str[i]+key < 0) {
				str[i] += 26;
			}
			str[i] += key;
			str[i] %= 26;
			str[i] += 'A';
		}
		puts(str, stdout);
	}
	
}

int main() {
	
	int key;
	char str[50] = {0,};
	printf("평문 또는 암호문을 입력하시오 :");
	fgets(str, sizeof(str), stdin);
	str[strlen(str) - 1] = '\0';
	printf("키 값을 입력하시오 :");
	scanf(" %d", &key);

	Caesar(str, key);
	printf("암호화 또는 복호화된 결과 출력 :");
	fputs(str, stdout);

	
	
	getchar();
	return 0;
}

Hello World, Nice to meet you

Fcjjm Umpjb, Lgac rm kccr wms

 

'C > 암호학' 카테고리의 다른 글

Transposition Cipher[C]  (0) 2023.09.04
Vigenere Cipher[C]  (0) 2023.09.01
EED(Extend Euclid Algorithm)[c]  (0) 2023.09.01