암호화 , 복호화 간단 예제
오늘은 하루종일 삽질하는군 -.-;;



#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;

}





 

Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 987,323
Today : 401 Yesterday : 409