일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이어버드
- 파라미터
- 델파이
- 설치
- Firebird
- VB.NET
- 셋업
- Delphi
- 소니
- 시리얼 통신
- Visual Studio 2005
- 초보
- c#
- vb
- MFC
- winsock
- 입문
- xml
- SDK
- PostgreSQL
- 데이터베이스
- 기초
- 문자열
- 예제
- Visual Basic
- WIN32 SDK
- SQL
- 인스톨
- dll
- MySQL
- Today
- Total
프로그래밍 노트
파일을 암호화 / 복호화 하기 본문
◆ 윈도우즈 API를 이용하여 파일 암호화하기
#include <io.h> // 파일관련
#include <WinCrypt.h> // 암호화
:
// 암호화 버튼을 클릭했을 때
void CCiperFileDlg::OnBnClickedEncode()
{
BYTE *bBuff;
DWORD dwFileLen;
CString csFile;
FILE *pFile;
m_File.GetWindowText(csFile);
// 선택한 파일을 바이너리 형식으로 열기
pFile = fopen(csFile, "rb");
if(!pFile)
{
AfxMessageBox("파일읽을때 에러났어");
return;
}
dwFileLen = _filelength(fileno(pFile));
bBuff = new BYTE [dwFileLen];
// 파일 읽어서 버퍼에 저장
fread(bBuff, 1, dwFileLen, pFile);
fclose(pFile);
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
CString csPass;
m_Pass.GetWindowText(csPass);
// 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))
{
AfxMessageBox("암호화 실패야");
return;
}
}
// 해쉬 만들기
CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
// 해쉬 값 계산
CryptHashData(hHash, (BYTE*)(LPCTSTR)csPass, csPass.GetLength(), 0);
// 키 만들기\tab
CryptDeriveKey(hProv, CALG_RC4, hHash, 0x0080*0x10000, &hKey);
// 암호화\tab
CryptEncrypt(hKey, 0, TRUE, 0, bBuff, &dwFileLen, dwFileLen);
// 해쉬 없애기
CryptDestroyHash(hHash);
// CSP 핸들 풀어주기
CryptReleaseContext(hProv, 0);
csFile += ".CPR";
// 파일저장 윈도우 표시
CFileDialog fDlg(FALSE, "", csFile);
if(fDlg.DoModal() == IDOK)
{
// 암호화된 파일 저장하기
pFile = fopen(fDlg.GetPathName(), "wb");
fwrite(bBuff, 1, dwFileLen, pFile);
fclose(pFile);
}
// 버퍼 삭제
delete [] bBuff;
}
◆ 윈도우즈 API를 이용하여 파일 복호화하기
// 복호화 버튼을 클릭했을 때
void CCiperFileDlg::OnBnClickedDecode()
{
BYTE *bBuff;
DWORD dwFileLen;
CString csFile;
FILE *pFile;
m_File.GetWindowText(csFile);
// 선택한 파일을 바이너리 형식으로 열기
pFile = fopen(csFile, "rb");
if(!pFile)
{
AfxMessageBox("파일읽을때 에러났어");
return;
}
dwFileLen = _filelength(fileno(pFile));
bBuff = new BYTE [dwFileLen];
// 파일 읽어서 버퍼에 저장
fread(bBuff, 1, dwFileLen, pFile);
fclose(pFile);
HCRYPTPROV hProv;
HCRYPTHASH hHash;
HCRYPTKEY hKey;
CString csPass;
m_Pass.GetWindowText(csPass);
// 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))
{
AfxMessageBox("복호화 실패야");
return;
}
}
// 해쉬 만들기
CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash);
// 해쉬 값 계산
CryptHashData(hHash, (BYTE*)(LPCTSTR)csPass, csPass.GetLength(), 0);
// 키 만들기\tab
CryptDeriveKey(hProv, CALG_RC4, hHash, 0x0080*0x10000, &hKey);
// 복호화
CryptDecrypt(hKey, 0, TRUE, 0, bBuff, &dwFileLen);
// 해쉬 없애기
CryptDestroyHash(hHash);
// CSP 핸들 풀어주기
CryptReleaseContext(hProv, 0);
// 파일저장 윈도우 표시
CFileDialog fdlg(FALSE, "", csFile);
if(fdlg.DoModal() == IDOK)
{
// 복호화된 파일 저장하기
pFile = fopen(fdlg.GetPathName(), "wb");
fwrite(bBuff, 1, dwFileLen, pFile);
fclose(pFile);
}
// 버퍼 삭제
delete [] bBuff;
}
이 프로젝트는 MFC 응용 프로그램의 다이알로그 형식으로 만들었다.
여기서 텍스트박스나 버튼에 대한 설명은 안한다.
VS2005가 깔려있으면 밑의 집파일을 다운받아서 CiperFile.sln을 더블클릭하여
빌드하면 바로 테스트를 해볼수 있다.

Visual Studio 2005로 만든 프로젝트 파일