프로그래밍 노트

파일을 암호화 / 복호화 하기 본문

MFC TIP

파일을 암호화 / 복호화 하기

띠리 2007. 6. 21. 14:09
파일을 암호화 . 복호화하기

윈도우즈 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을 더블클릭하여
빌드하면 바로 테스트를 해볼수 있다.

invalid-file

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




Comments