티스토리 뷰

게임 서버 프로그래밍 책을보다가 기초라이브러리 제작목록에 유용한 코드들이 있어서


따라해봤다. 앞으로 책을읽다 흥미가 가는 코드들은 따라해본다음 포스팅할 예정이다...

오늘은 암호화,복호화(Encrypt,Decrypt)이다. 

여기서 소개해주는 암호화 방법은 모든 바이트마다 특정값(Key값)을 XOR연산을 시켜서 

원본값을 숨기는 방법이다.

복호화 방법은 거꾸로 암호화된 바이트에 암호화할때 사용했던 특정값(Key값)을 다시 XOR 시킴으로써

원본값을 확인한다.

그리고 여기서 특정값(Key값)을 알아내기만 하면 쉽게 복호화 할수있다는 약점을 가리기위해

바이트마다 암호화키를 바꾸는 공식을 넣어서 약간더 안정성을 높인다.

실무에서는 어떻게 사용하는지 모르겠지만 이정도 방법만으로도 간단한 암호화 모듈로는 쓸만하겠다.

역시 이번준비물은 <windows.h>이다.

이제 코드를 보자.

CCrypt.h

#include <windows.h>


class CCrypt
{
public:
CCrypt(void);
~CCrypt(void);

static BOOL Encrypt(BYTE* source, BYTE* destination, DWORD length);
static BOOL Decrypt(BYTE* source, BYTE* destination, DWORD length);


};



CCrypt.cpp

#include "Crypt.h"

 

const INT C1 = 52845;

const INT C2 = 22719;

const INT KEY = 78695;

 

 

CCrypt::CCrypt(void)

{

}

 

CCrypt::~CCrypt(void)

{

}

 

BOOL CCrypt::Encrypt(BYTE *source, BYTE *destination, DWORD length)

{

DWORD i;

INT key= KEY;

 

if(!source || !destination || length <= 0)

{

return FALSE;

}

 

for(i=0; i<length; i++)

{

destination[i] = source[i]^key>>8;

key = (destination[i]+key) * C1 + C2;

}

 

return TRUE;

 

}

 

BOOL CCrypt::Decrypt(BYTE *source, BYTE *destination, DWORD length)

{

DWORD i;

BYTE previousBlock;

INT key = KEY;

 

if(!source || !destination || length <= 0)

{

return FALSE;

}

 

for(i=0; i<length; i++)

{

previousBlock = source[i];

destination[i] = source[i]^key>>8;

key = (previousBlock + key) * C1 + C2;

}

return TRUE;

 

}

테스트 코드이다.

main.cpp

 

#include <iostream>

#include "Crypt.h"

 

void main()

{

 

BYTE origin[] = "abcdefg";

 

BYTE encrypt[10];

BYTE decrypt[10];

ZeroMemory(encrypt,sizeof(encrypt));

ZeroMemory(decrypt,sizeof(decrypt));

 

CCrypt::Encrypt(origin,encrypt,sizeof(origin));

 

std::cout<<"원  본 : "<<origin<<std::endl;

std::cout<<"암호화 : "<<encrypt<<std::endl;

 

CCrypt::Decrypt(encrypt,decrypt,sizeof(encrypt));

 

std::cout<<"복호화 : "<<decrypt<<std::endl;

 

 

}




댓글