티스토리 뷰

728x90
반응형

 

 

 

 

이번에 수업 시간에 과제로 했던 것을 정리해봅니다. 과제 내용은 DES 암호화된 파일이 주어지고, 해당 내용을 주어진 key 값으로 복호화하는 코드를 C언어로 작성하라는 것이었습니다. Python으로 하면 10줄도 안되서 작성할 것을 익숙지 않은 C언어로 작성하려니 힘들었던 것 같습니다. 그리고 Python에서는 관련 모듈을 pip 로 설치하고 import 하면 끝이었는데, C언어의 경우에는 Visual Studio 에서 할 때 OpenSSL 라이브러리 설치부터 프로젝트에 라이브러리 추가까지 번거로운 작업이 다소 있었습니다. 😅

 

우선 Python(파이썬)으로 DES 복호화 예제를 구성해보겠습니다.

from Crypto.Cipher import DES

def pad(text):
    while len(text) % 8 != 0:
        text += ' '
    return text

# 8 bytes of key
key = 'domdomii'.encode() # key = b'domdomii'

des = DES.new(key, DES.MODE_ECB)

# plain_text
text = "Hello, this is domdomi's blog..!"
print("원본: " + text)

padded_text = pad(text)

encrypted_text = des.encrypt(padded_text.encode())

with open("enc.des", "wb") as f:
    f.write(encrypted_text)
    f.close()

print("DES 암호화된 결과:")
print(encrypted_text)

decrypted_text = des.decrypt(encrypted_text)

print("DES 복호화된 결과:")
print(decrypted_text.decode())

위 코드를 잠깐 설명하자면, domdomii 라는 key가 있고, 평문으로 Hello, this is domdomi's blog..! 라는 문자열이 주어졌습니다. 그리고 이후 C언어 예제 작성 시에 위 평문을 암호화한 내용을 파일로 읽어들이기 위해서 enc.des 라는 파일을 만들어주었습니다. 그리고 바로 decrypt 함수를 사용해서 복화화한 결과를 나타내줍니다. 위 코드의 실행 결과는 아래와 같습니다.

C:\Users\domdomi\des>python des.py
원본: Hello, this is domdomi's blog..!
DES 암호화된 결과:
b"y\x15\x82&\x94H\x883\x93_\x89'yXi\xe2\xe4o\x94eM\xbe!{\x0fS\xea/\xbe\x8do\xd2"
DES 복호화된 결과:
Hello, this is domdomi's blog..!

잘 나왔지요? Python 코드로 작성하면 이리도 쉬울 것을 교수님께서는 C언어로 작성하라고 하셨습니다.

이제 C언어로 작성해보겠습니다. C언어로 작성할 때는 과제의 내용대로 불러드린 암호화된 파일의 내용을 읽어들여 복호화하는 코드만 작성해보겠습니다. 아까 파이썬으로 파일 쓰기한 enc.des 라는 파일을 이용할 것입니다.

 

일단 코드를 보기에 앞서 C언어로 DES Decrypt 를 수행하기 위한 사전작업에 대해서는 설명을 생략할 생각입니다. 간단히 사전작업이 뭐가 있는 지에 대해서만 얘기하자면, Visual Studio IDE에 필요한 OpenSSL 라이브러리 설치, 라이브러리 사용을 위한 프로젝트 속성 변경, 라이브러리 종속성 추가, 등등이 있겠습니다. 이 부분에 대해서 혹시나 궁금하시다면 댓글로 질문해주세요.

 

대망의 C언어 코드는 아래와 같이 작성했습니다. 교수님이 과제 점수를 안알려주셔서 정확한 코드인지는 모르겠지만, 결과적으로 위 Python 언어와 동일한 결과를 내는 것으로 보아 이상없이 동작하는 코드임은 알 수 있습니다.

#define _CRT_SECURE_NO_WARNINGS

#include <openssl/des.h>
#include <stdio.h>

#define ENC 1
#define DEC 0

int main()
{
	int k, cnt;
	int _key[8] = { 0x92, 0xec, 0x01, 0x58, 0xd6, 0x16, 0xae, 0x89 };
	FILE* fin = NULL, * fout = NULL;
	DES_cblock key;
	DES_key_schedule schedule;
	DES_LONG cipher_text[2] = { 0xffffffff, 0x0f0f0f0f0 };

	fin = fopen("enc.des", "rb");
	fout = fopen("enc.txt", "wb");

	if (NULL == fin) {
		printf("enc.des is not here.");
		return -1;
	}

	fseek(fin, 0L, SEEK_END);
	cnt = (int)(ftell(fin) / 8);
	fseek(fin, 0L, SEEK_SET);

	DES_random_key(&key);

	for (int i = 0; i < 8; i++) {
		key[i] = _key[i];
	}

	if ((k = DES_set_key_checked(&key, &schedule)) != 0)
		printf("\nkey error : %d \n", k);

	for (int i = 0; i < cnt; i++) {
		fread(&cipher_text[0], sizeof(DES_LONG), 1, fin);
		fread(&cipher_text[1], sizeof(DES_LONG), 1, fin);
		DES_encrypt1(&cipher_text[0], &schedule, DEC);
		// printf("%.4s%.4s", &cipher_text[0], &cipher_text[1]);
		fwrite(&cipher_text[0], sizeof(DES_LONG), 1, fout);
		fwrite(&cipher_text[1], sizeof(DES_LONG), 1, fout);
	}

	fclose(fin);
	fclose(fout);
}

위 코드는 과제에서 내어준 skeleton 코드를 그대로 사용한 것입니다. 과제에서 주어진 key 값을 사용하였고, 주어진 enc.des 파일을 사용하였습니다. 실제로 printf 함수가 실행되었을 때 복호화된 문자열이 출력됩니다.

 

(참고로 DES_set_key_checked 함수로 인해 올바르지 않은 key 형식이나 취약한 key 형식을 사용할 수 없었습니다. 그래서 python 코드에서 사용한 임의의 key를 사용하려다가 그냥 과제에서 주어진 key 값 그대로 사용하였습니다.)

 


 

그리고 추가로 교수님이 주신 암호화된 파일을 복호화 했을 때 결과 문자열의 앞부분에 특이한 텍스트 파일 헤더가 보였습니다. 이 부분에 대해서 잠깐 다루고 가자면, 텍스트 편집기로 열어보았을 때는 문자열이 깨지지 않고 정상적인 문자열이 잘 보입니다. 하지만 hex 에디터로 열어보면 앞부분에 문자열이 깨져 보입니다. 아래를 보도록 하겠습니다.

 

텍스트 편집기로 복호화된 파일을 열었을 때는 문자열이 잘 보이는 것을 알 수 있습니다.

하지만 헥사 에디터로 복호화된 파일을 열었을 때는 파일 헤더에 이상한 문자열이 보입니다.

EF BB BF 가 보입니다. 이 부분은 ASCII 코드로 보이지는 않습니다. 특수한 역할을 하는 값인 것 같은데요. 찾아보니깐 Visual Studio 에서 파일을 만들거나 하게 되면 앞에 BOM(Byte Order Mark)라는 것을 붙인다고 합니다. 주로 8-bit Unicode 즉 흔히 우리가 아는 UTF-8 파일 포맷이라는 것을 표시하기 위해 붙이는 헤더라고 합니다. 신기한 것을 배웠습니다.

 

이렇게 해서 교수님이 내주신 과제 복기를 마쳐보았습니다. 혹시나 이 글이 누군가에게 도움이 되었다면 비밀 댓글로 카카오톡 기프티콘 선물코드를 보내주시면.....(사심가득)........ 감사하겠습니다! ㅎㅎ

 

- 끝 -

728x90
반응형
댓글