본문 바로가기
IT-개발,DB

[개발/mfc] WINDOWS API를 이용한 암호화 간단 예제

by SB리치퍼슨 2011. 11. 8.
[mfc] WINDOWS API를 이용한 암호화 간단 예제

#include "stdafx.h"
#include <Windows.h>
#include <WinCrypt.h>

#define    MY_PASS       "papaya"           // 패스워드
#define    KeyLen        0x0080 * 0x10000    // 128-bit

int _tmain(int argc, _TCHAR* argv[])
{

    HCRYPTPROV    hProv;
    HCRYPTHASH    hHash;
    HCRYPTKEY     hKey;

    BYTE          pbData[100] = "TEST TEST TEST REAL TEST";
    DWORD         dwDataLen = (DWORD)strlen((char*)pbData) + 1;

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

    if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, 
                            PROV_RSA_FULL, 0))
    {
        // 유저용 키 컨테이너 만들기
        if(!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV,
                                PROV_RSA_FULL, CRYPT_NEWKEYSET))
        {
            printf("유저용 키 켄테이너 만들기 에러\n");
            return 1;
        }
    }

    // 해쉬 만들기
    if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))
    {
        printf("해쉬 만들기 에러\n");
        return 2;
    }

    // 해쉬 값 계산
    if(!CryptHashData(hHash, (BYTE*)MY_PASS, (DWORD)strlen(MY_PASS), 0))
    {
        printf("해쉬 값 계산 에러\n");
        return 3;
    }

    // 키 만들기
    if(!CryptDeriveKey(hProv, CALG_RC4, hHash, KeyLen, &hKey))
    {
        printf("키 만들기 에러\n");
        return 4;
    }

    // 암호화
    if(!CryptEncrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen, 100))
    {
        printf("암호화 에러\n");
        return 5;
    }
    printf("암호건 문자 -> %s\n", pbData);

    // 복호화
    if(!CryptDecrypt(hKey, 0, TRUE, 0, pbData, &dwDataLen))
    {
        printf("복호화 에러\n");
        return 6;
    }
    printf("암호푼 문자 -> %s\n", pbData);

    // 해쉬 없애기
    CryptDestroyHash(hHash);

    // CSP 핸들 풀어주기
    CryptReleaseContext(hProv, 0);

    return 0;
}


반응형

댓글