티스토리 뷰

#include "stdafx.h" #include <Windows.h> #include <atlstr.h> #define MAX_PASS 32 #define MY_PASS "HAHAHA" #pragma warning( disable: 4996 ) int DeCode(char *pszCode); int EnCode(char *pszCode); int main() { char szWork[MAX_PASS] = "BABO BABO BABO"; EnCode(szWork); CString strWork; printf("Encoded : %s\n", szWork); //ZeroMemory(szWork, strlen(szWork)); DeCode(szWork); printf("Decoded : %s\n", szWork); return 0; } // 암호화 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, CRYPT_EXPORTABLE, &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, CRYPT_EXPORTABLE, &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; }


http://wwwi.tistory.com/90 이 글에 있던 소스를 돌아가게 수정하였습니다.

'Programming > C++' 카테고리의 다른 글

c++ 클래스 생성자  (0) 2018.05.30
CURL visual studio include  (0) 2018.05.30
암호화 API 정리  (0) 2018.05.24
class 초기화  (0) 2018.05.21
C++ namespace  (0) 2017.04.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함