프로그래밍 노트

WINDOW API를 이용한 암호화 간단 예제 본문

Win32 SDK 초보

WINDOW API를 이용한 암호화 간단 예제

띠리 2007. 5. 17. 17:29

높은 보안이 필요치 않아 암호를 간단하게 만들려고 해봤지만
암호는 간단하게 만들어지는 것이 아니였다. -.-;;
윈도우즈 API를 쓰면 그나마 머리 안쓰고(-.-;;) 만들 수 있었다.

 

#include "stdafx.h"

#include <Windows.h>

#include <WinCrypt.h>


#define    MY_PASS       "NALNARI"           // 패스워드

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






Comments