Programming

데이터 암호화 (RC4 스트림 암호화 알고리즘)

bcheul 2006. 12. 11. 23:47

데이터 암호화 방법


1.요약
데이터를 암호화하는 방법에는 여러가지가 있는데 가장 간단한 방법이 배타적 논리합(Exclusive OR)를 이용하는 방법이 있습니다.

이 방법은 너무 간단해서 보안에 치명적이죠. 특별한 암호방법을 고안해낼려면 그쪽 분야에 많은 연구와 노력이 필요한데 저를 포함해 대부분 암호화에 대한 지식이 거의 전무할겁니다.

저같은 사람들을 위해 MS에서 암호화를 위한 API를 제공하고 있습니다.
하지만 이것도 사용하기가 너무 복잡하고 여러 단계를 거져야하는 불편함이 있습니다.

그래서 최대한 사용하기 간단하게 Class로 만들어 보았습니다.


2.본문

먼저 암호에 필요한 API함수는 어떤것이 있는지 알아보겠습니다.

BOOL WINAPI CryptAcquireContext(HCRYPTPROV *phProv, LPCTSTR Container, 

                LPCTSTR pszProvider, DWORD dwProvType, DWORD dwFlags); 



BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, 

                CRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash); 



BOOL WINAPI CryptHashData(HCRYPTHASH hHash, BYTE *pbData, 

                DWORD dwDataLen, DWORD dwFlags); 



BOOL WINAPI CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, 

                HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey); 



BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, 

                BOOL Final, DWORD dwFlags, BYTE *pbData, 

                DWORD *pdwDataLen, DWORD dwBufLen); 



BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, 

                BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen); 

자세한 사용법은 MSDN을 참고하세요.

이러한 API의 사용법을 설명하지 않겠습니다. 사실 저도 자세히는 모름니다. Class 멤버 함수와 사용법을 소개드리겠습니다.

BOOL CCrypt::Create(LPBYTE pHashData, DWORD dwHashDataLen)
- 암호화나 해독에 필요한 Key를 생성하는 함수. 쉽게 여기에 Password가 들어간다고 생각하면 됩니다.
void CCrypt::Destroy()
- Create에서 만들어진 Handle을 제거합니다.
BOOL CCrypt::Encrypt(LPBYTE lpBuffer, DWORD& dwBufferLen, BOOL bFanal)
- 데이터를 암호화하는 함수
BOOL CCrypt::Decrypt(LPBYTE lpBuffer, DWORD& dwBufferLen, BOOL bFanal)
- 암호화된 데이터를 해독하는 함수

3.예제

dwDataLen = strPassword.GetLength(); 

CopyMemory(lpData, (LPVOID)(LPCTSTR)strPassword, strPassword.GetLength()); 



// 암호화 

CCrypt Crypt; 

Crypt.Create((LPBYTE)(LPCTSTR)strPassword, strPassword.GetLength()); 

Crypt.Encrypt(lpData, dwDataLen); 

Crypt.Destroy(); 



// 암호화된 데이터 해독 

Crypt.Create((LPBYTE)(LPCTSTR)strPassword, strPassword.GetLength()); 

Crypt.Decrypt(lpData, dwDataLen); 

lpData[dwDataLen] = '\0'; 

::MessageBox(NULL, (LPCTSTR)lpData, "", MB_OK); 


Crypt.zip 다운로드



- 2001.08.19 Smile Seo -

'Programming' 카테고리의 다른 글

USB 드라이버 관련자료  (0) 2007.04.27
IWebBrowser2::Document  (0) 2007.04.27
IWebBrowser2 Interface  (0) 2007.04.27
Vista 에서 버전별 Visual Studio 소개 및 사용  (0) 2007.02.28
다이알로그에 상태표시줄 달기~  (2) 2006.12.21