메시지, 파일 암호화 및 복호화하기
- 프로그래밍/C/C++
- 2018. 7. 22.
메시지, 파일 암호화 및 복호화하기
이번에는 메시지 암호화 및 복호화 하는 방법을 알아보겠다.
일단 암호화란 무엇일까??
문서 및 메시지를 다른 사람이 구분할 수 없는 문자 코드로 변경하는 것을 뜻합니다.
복호화는 무엇일까??
암호화된 문서 및 메시지를 원래의 형태로 복원하는 것을 뜻합니다.
우리는 XOR 연산으로 암호화를 해 보겠다.
#include <stdio.h>
#define SECRETKEY "!@#$%^&*()_+=-"
int strlen(char *dest);
int main()
{
char string[] = "1234567890";
int n = strlen(string);
puts(string);
for (int i = 0; i < n; i++)
string[i] ^= SECRETKEY[i];
puts(string);
for (int i = 0; i < n; i++)
string[i] ^= SECRETKEY[i];
puts(string);
}
int strlen(char *dest)
{
int n = 0;
while (*dest++) n++;
return n;
}
< 출력 >
2행에서 메시지 암호화 및 복호화에 사용될 키를 정의한다.
6행에서 암호화시킬 문자열을 정의한다.
9~10행에서 메시지를 암호화 한다. 비트 XOR(^) 연산은 각각의 비트 값을 비교하여 모두 0이거나 모두 1인경우는 0으로,
둘중의 하나만 1인 경우 1로 설정한다.
12~13행은 메시지 복호화를 한다.
이렇게 메시지를 암호화 하는 프로그램을 만들어 보았다.
기본적인 예이다. 나중에 이것을 채팅프로그램을 만들때 써봐야 겠다.
파일 암호화 및 복호화 하기
이번에는 파일 암호화를 시키고 복호화를 시켜보자.
#include <stdio.h>
int encryption();
int main()
{
encryption();
}
int encryption()
{
char data[1024];
char secret[16] = { "!@#$%^&*()_><,." };
FILE *fp;
size_t read_size, i;
long frpos, fwpos;
errno_t err;
err = fopen_s(&fp, "C:\\Users\\aossu\\Desktop\\test.txt", "r+b");
if (err != 0) {
perror("파일 열기 에러");
return -1;
}
while (!feof(fp)) {
fwpos = ftell(fp);
read_size = fread(data, 1, 1024, fp);
if (read_size == 0) break;
for (i = 0; i < read_size; i++)
data[i] ^= secret[i % 16];
frpos = ftell(fp);
fseek(fp, fwpos, SEEK_SET);
fwrite(data, 1, read_size, fp);
fseek(fp, frpos, SEEK_SET);
}
fclose(fp);
return 1;
}
< 메모장 초기 내용 >
10행에서 암호화 키를 정의한다.
13행에서 파일의 읽고 쓸 위치를 저장할 변수를 선언한다.
21행에서 파일이 끝까지 반복문을 돌린다.
22행에서 현재 파일의 위치를 fwpos 변수에 넣는다.
23행에서 파일을 1024바이트 만큼 읽는다. 읽을 파일의 길이가 1024보다 작다면 그 크기만큼만 읽혀진다.
24행에서 읽혀진 파일의 길이가 0 이라면 프로그램을 종료한다.
25~26행에서 암호화 작업을 한다.
27행에서 현재 파일의 위치를 frpos에 넣는다.
28행에서 파일의 위치를 처음으로 옮긴다.
29행에서 data에 담긴 데이터를 파일에다가 read_size만큼 1바이트씩 쓴다.
30행에서 파일의 위치를 처음의 위치에서 frpos만큼 떨어진곳에 위치를 한다.
이렇게 메시지와 파일 암호화 및 복호화를 시켜보았다.
상용화된 암호화 알고리즘은 DES, 3DES, IDEA, MD5 등이 있으며 암호화 전문 서적을 참조하면 되겠다.