프로그래밍 노트

암호화 , 복호화 간단 예제 본문

Win32 SDK 초보

암호화 , 복호화 간단 예제

띠리 2007. 5. 22. 20:31
암호화 , 복호화 간단 예제
오늘은 하루종일 삽질하는군 -.-;;



#include "stdafx.h"

#include <WinCrypt.h>


#define    MAX_PASS    32

#define    MY_PASS    "HAHAHA"
 

int DeCode (char *pszCode);

int EnCode (char *pszCode);


int main()

{

    char    szWork[MAX_PASS] = "BABO BABO BABO";


    EnCode(szWork);


    CString    strWork;

    strWork.Format("%s", szWork);

    ZeroMemory(szWork, strlen(szWork));

    sprintf(szWork, "%s", (LPCSTR)strWork);


    DeCode(szWork);

}


// 암호화

int EnCode (char *pszCode)

{

    HCRYPTPROV    hProv;

    HCRYPTHASH    hHash;

    HCRYPTKEY    hKey;

    BYTE        pbCode[MAX_PASS];

    DWORD        dwDataLen;


    ZeroMemory(pbCode, MAX_PASS);

    sprintf((char*)pbCode, "%s", pszCode);

    dwDataLen = (DWORD)strlen((char*)pbCode) + 1;


    // CSP(Crystographic Service Provider) 핸들 얻기

    if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))

    {

        // 해쉬 만들기

        if(CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))

        {

            // 해쉬 값 계산

            if(CryptHashData(hHash, (BYTE*)MY_PASS, (DWORD)strlen(MY_PASS), 0))

            {

                // 키 만들기

                if(CryptDeriveKey(hProv, CALG_RC4, hHash, KeyLen, &hKey))

                {

                    // 암호화\tab             

                    if(CryptEncrypt(hKey, 0, TRUE, 0, pbCode, &dwDataLen, MAX_PASS))

                    {

                        sprintf(pszCode, "%s", (char*)pbCode);

                    } else {

                        return 5;    // 암호화 에러

                    }

                } else {

                    return 4;        // 키 만들기 에러

                }

            } else {

                return 3;            // 해쉬 값 계산 에러

            }

        } else {

            return 2;                // 해쉬 만들기 에러

        }

    } else {

        // 유저용 키 컨테이너 만들기

        if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))

        {

            return 1;                // 유저용 키 켄테이너 만들기 에러

        }

    }


    // 해쉬 없애기

    CryptDestroyHash(hHash);


    // CSP 핸들 풀어주기

    CryptReleaseContext(hProv, 0);


    return 0;

}


// 복호화

int DeCode (char *pszCode)

{

    HCRYPTPROV    hProv;

    HCRYPTHASH    hHash;

    HCRYPTKEY    hKey;

    BYTE        pbCode[MAX_PASS];

    DWORD        dwDataLen;


    ZeroMemory(pbCode, MAX_PASS);

    sprintf((char*)pbCode, "%s", pszCode);

    dwDataLen = (DWORD)strlen((char*)pbCode) + 1;


    // CSP(Crystographic Service Provider) 핸들 얻기

    if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))

    {

        // 해쉬 만들기

        if(CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))

        {

            // 해쉬 값 계산

            if(CryptHashData(hHash, (BYTE*)MY_PASS, (DWORD)strlen(MY_PASS), 0))

            {

                // 키 만들기

                if(CryptDeriveKey(hProv, CALG_RC4, hHash, KeyLen, &hKey))

                {

                    // 복호화

                    if(CryptDecrypt(hKey, 0, TRUE, 0, pbCode, &dwDataLen)){

                        sprintf(pszCode, "%s", (char*)pbCode);

                    } else {

                        return 6;    // 복호화 에러

                    }

                } else {

                    return 4;        // 키 만들기 에러

                }

            } else {

                return 3;            // 해쉬 값 계산 에러

            }

        } else {

            return 2;                // 해쉬 만들기 에러

        }

    } else    {

        // 유저용 키 컨테이너 만들기

        if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))

        {

            return 1;                // 유저용 키 켄테이너 만들기 에러

        }

    }


    // 해쉬 없애기

    CryptDestroyHash(hHash);


    // CSP 핸들 풀어주기

    CryptReleaseContext(hProv, 0);


    return 0;

}





 

Comments