본문 바로가기

해킹&보안/암호학

[곱셈 암호 알고리즘]

각 문자를 특정한 숫자로 매핑하고, 그 숫자에 특정한 값(키)를 곱하여 암호화하는 기술.

일반적으로 알파벳을 숫자로 매핑하여 사용합니다. 
예를 들어, 'A'를 0으로, 'B'를 1로, 'C'를 2로, ..., 'Z'를 25로 매핑할 수 있습니다

키 값은 반드시 원본 문자의 알파벳 개수와 서로소인 정수여야 합니다. 
서로소인 이유는 키와 알파벳 개수의 최대공약수가 1이 되어야만 
모든 문자가 고유한 암호화된 값을 가질 수 있기 때문이다.

코드를 짜기전 이 암호 알고리즘은 어떤 기능을 하는지, 그 기능을 넣으려면 어떻게 짜야하는지 생각해봤다.
1. 알파벳을 숫자로 매핑
(각 알파벳에 대응하는 숫자 매핑)
2. 키 값 선택
(키 값은 알파벳 개수와 서로소인 정수여야 한다.
3. 암호화 함수 설계
(함수를 설계하여 문자열과 키를 입력 받고 각 문자를 암호화 하는 과정 구현)
4. 암호화 과정 
(해당 문자에 대해서만 암호화를 하고, 공백이나 특수문자는 건너뛰어야 한다.)
5. 암호화된 값의 범위
(암호화된 값은 순환 범위 내에 있어야한다. 범위를 벗어낳 경우 mod를 취해준다.)
6. 결과 출력
(암호화된 메시지 출력할 때 알파벳으로 변환하여 출력해준다.)
 

위 조건을 참고하여 c언어로 구현해보자

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void encrypt(char *message, int key);
int main() {
	char message[100];
	int key;
	printf("암호화할 평문을 입력하세요: ");
	fgets(message, sizeof(message), stdin);
	printf("암호화 키를 입력하세요 (0보다 큰 정수): ");
	scanf("%d", &key);
	encrypt(message, key);
	printf("암호문: %s\n", message);
	return 0;
}
void encrypt(char *message, int key) {
	int i;
	int length = strlen(message);
	for (i = 0; i < length; i++) {
		=
		        if (message[i] == ' ') {
			continue;
		}
		=
		        if (isalpha(message[i])) {
			if (isupper(message[i])) {
				=
				                message[i] = ((message[i] - 'A') * key) % 26 + 'A';
			} else {
				=
				                message[i] = ((message[i] - 'a') * key) % 26 + 'a';
			}
		}
	}
}

이런 코드를 구현할 수 있다.  하나씩 자세히 확인해보자.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void encrypt(char *message, int key);

 
코드 시작 후 encrypt 함수를 호출해준다
 

1 void encrypt(char *message, int key) {
2    int i;
3    int length = strlen(message);
4    
5    for(i = 0; i < length; i++) {
6
7        if (message[i] == ' ') {
8            continue;
9        }
10        if (isalpha(message[i])) {
11            if (isupper(message[i])) { 
12                message[i] = ((message[i] - 'A') * key) % 26 + 'A';
13            } else {
14                message[i] = ((message[i] - 'a') * key) % 26 + 'a';
15            }
16        }
17    }
18 }

방금 호출한 encrypt 함수이다
~3     변수 i를 선언, strlen(message)를 이용하여 메시지의 길이를 확인하고  length에 저장한다.
4~9   반복문을 사용하여 암호화를 한다. for을 아용하여 i를 length - 1 까지 진행한다
         여기서 if는 공백인지 확인하게 되고 만약 현재 공백문자이면 continue;를 통해 반복을 건너뛴다.(쉽게 만하면 공백은            암호화하지 않고 넘어간다)
10~18 알파벳인지 확인 후 알파벡일 경우에는 암호화 과정 수행,문자가 알파벳일때 참을 반환한다.
           이후, 대문자인지 소문자인지 확인을 위해 if, else를 활용하여 대.소문자 확인한다.
           대문자일경우 length[i] - 'A'를 하여 0~25의 값으로 변환한다.
           25를 벗어나면 mod26으로 값을 범위 안으로 유도한다. 다시 알파벡으로 맞추기 위해 'A'를 더한다.
           소문자일 경우 대문자와 같은 방법을 진행하는데 기준은 'A'가 아닌 'a'로 진행한다
 
 

int main() {
    char message[100];
    int key;
    printf("암호화할 메시지를 입력하세요: ");
    fgets(message, sizeof(message), stdin);
    printf("암호화에 사용할 키를 입력하세요 (0보다 큰 정수): ");
    scanf("%d", &key);
    encrypt(message, key);
    printf("암호화된 메시지: %s\n", message);

    return 0;
}

함수를 빠져나오고 코드를 다시 진행한다.
배열, 함수 선언을 하고 평문을 입력받고, 암호화에 사용한 암호키도 입력을 받는다. 
입력된 메시지와 키를 암호화 함수에 전달하여 암호화를 수행한 후, 암호화된 결과를 출력해줍니다.

'해킹&보안 > 암호학' 카테고리의 다른 글

AES (고급 암호화 표준)  (0) 2024.05.24
블록 암호  (0) 2024.05.24
[아핀 암호 알고리즘]  (0) 2024.05.01
[카이사르 복호화 알고리즘]  (1) 2024.03.24
[카이사르 암호화 알고리즘]  (0) 2024.03.24