암호화 , 복호화 간단 예제
오늘은 하루종일 삽질하는군 -.-;;
#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;
}