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 |