vc + 네트워크 보안 프로 그래 밍 범례 (17) - open ssl 파일 암호 화 및 복호화 실현

OpenSSL 전체 패 키 지 는 세 가지 주요 기능 부분 으로 나 눌 수 있 습 니 다. 암호 컴 퓨 팅 라 이브 러 리, SSL 프로 토 콜 라 이브 러 리 와 응용 프로그램 입 니 다.OpenSSL 의 디 렉 터 리 구조 도 자연히 이 세 가지 기능 부분 을 중심 으로 기획 되 었 다.암호학 을 바탕 으로 하 는 안전 개발 패키지 로 서 OpenSSL 이 제공 하 는 기능 은 상당히 강력 하고 전면적 이 며 주요 암호 알고리즘, 자주 사용 하 는 키 와 인증서 패 키 징 관리 기능 과 SSL 프로 토 콜 을 포함 하고 테스트 나 다른 목적 으로 사용 할 수 있 는 다양한 응용 프로그램 을 제공 합 니 다.대칭 암호 화 알고리즘 OpenSSL 은 모두 8 가지 대칭 암호 화 알고리즘 을 제 공 했 는데 그 중에서 7 가 지 는 그룹 암호 화 알고리즘 이 고 유일한 스 트림 암호 화 알고리즘 은 RC4 이다.이 7 가지 그룹 암호 화 알고리즘 은 AES, DES, Blowfish, CAST, IDEA, RC2, RC5 로 모두 전자 암호 본 모드 (ECB), 암호 화 그룹 링크 모드 (CBC), 암호 화 피드백 모드 (CFB) 와 출력 피드백 모드 (OFB) 네 가지 자주 사용 하 는 그룹 암호 화 모드 를 지원 한다.그 중에서 AES 가 사용 하 는 암호 화 피드백 모드 (CFB) 와 출력 피드백 모드 (OFB) 의 그룹 길 이 는 128 비트 이 고 다른 알고리즘 은 64 비트 를 사용한다.사실 DES 알고리즘 에는 자주 사용 되 는 DES 알고리즘 뿐만 아니 라 세 개의 키 와 두 개의 키 3DES 알고리즘 도 지원 합 니 다.비대 칭 암호 화 알고리즘 OpenSSL 은 DH 알고리즘, RSA 알고리즘, DSA 알고리즘 과 타원 곡선 알고리즘 (EC) 을 포함 한 4 가지 비대 칭 암호 화 알고리즘 을 구현 했다.DH 알고리즘 일반 사용자 키 교환.RSA 알고리즘 은 키 교환 에 도 사용 할 수 있 고 디지털 서명 에 도 사용 할 수 있 습 니 다. 물론 느 린 속 도 를 견 딜 수 있다 면 데이터 암호 화 에 도 사용 할 수 있 습 니 다.DSA 알고리즘 은 일반적으로 디지털 서명 에 만 사용 된다.정보 요약 알고리즘 OpenSSL 은 MD2, MD5, MDC 2, SHA (SHA 1) 와 RIPEMD 등 5 가지 정보 요약 알고리즘 을 실현 했다.SHA 알고리즘 은 사실상 SHA 와 SHA 1 두 가지 정보 요약 알고리즘 을 포함 하고 있 으 며, OpenSSL 은 DSS 표준 에 규정된 두 가지 정보 요약 알고리즘 DSS 와 DSS 1 도 구현 했다.
우 리 는 VC + + 로 파일 암호 화 를 실현 할 것 입 니 다. 코드 구현 과 설명 을 보십시오.
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH  0x00800000
void HandleError(char *s);
HCRYPTPROV GetCryptProv();

#define ENCRYPT_ALGORITHM CALG_RC4 
#define ENCRYPT_BLOCK_SIZE 8 


BOOL EncryptFile(
     PCHAR szSource, 
     PCHAR szDestination, 
     PCHAR szPassword); 

HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword);
HCRYPTKEY GenKeyByRandom(HCRYPTPROV hCryptProv,FILE* hDestination);
 
//-------------------------------------------------------------------
// Begin main.

void main(void) 
{ 
    PCHAR szSource; 
    PCHAR szDestination; 
    CHAR szPassword[100] = ""; 
    char  response;
 
	if(!(szSource=(char *)malloc(100)))
		HandleError("Memory allocation failed.");
	if(!(szDestination=(char *)malloc(100)))
		HandleError("Memory allocation failed.");

	printf("      . 

"); printf(" : "); fgets(szSource, 100, stdin); if(szSource[strlen(szSource)-1] == '
') szSource[strlen(szSource)-1] = '\0'; printf(" : "); fgets(szDestination, 100, stdin); if(szDestination[strlen(szDestination)-1] == '
') szDestination[strlen(szDestination)-1] = '\0'; printf(" ? ( y/n ) "); response = getchar(); if(response == 'y') { printf(" :"); getchar(); gets(szPassword); } else { printf(" .
"); } //------------------------------------------------------------------- // EncryptFile . if(EncryptFile(szSource, szDestination, szPassword)) { printf(" %s !
", szSource); printf(" %s .
",szDestination); } else { HandleError(" !"); } //------------------------------------------------------------------- // . if(szSource) free(szSource); if(szDestination) free(szDestination); } // end main //------------------------------------------------------------------- // : szSource , szDestination // : // szSource: // szDestination: // szPassword: static BOOL EncryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szPassword) { //------------------------------------------------------------------- // . FILE *hSource; FILE *hDestination; HCRYPTPROV hCryptProv; HCRYPTKEY hKey; PBYTE pbBuffer; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; //------------------------------------------------------------------- // . if(hSource = fopen(szSource,"rb")) { printf(" %s .
", szSource); } else { HandleError(" !"); } //------------------------------------------------------------------- // . if(hDestination = fopen(szDestination,"wb")) { printf(" %s .
", szDestination); } else { HandleError(" !"); } // hCryptProv = GetCryptProv(); //------------------------------------------------------------------- // . if(!szPassword || strcmp(szPassword,"")==0 ) { //-------------------------------------------------------------- // , , . hKey = GenKeyByRandom( hCryptProv, hDestination); } else { //-------------------------------------------------------------- // , hKey=GenKeyByPassword( hCryptProv, szPassword); } //-------------------------------------------------------------------- // ENCRYPT_BLOCK_SIZE , // ENCRYPT_BLOCK_SIZE 。 // 。 dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; //-------------------------------------------------------------------- // . , if(ENCRYPT_BLOCK_SIZE > 1) dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; else dwBufferLen = dwBlockLen; //------------------------------------------------------------------- // . if(pbBuffer = (BYTE *)malloc(dwBufferLen)) { printf(" .
"); } else { HandleError(" .
"); } //------------------------------------------------------------------- // do { //------------------------------------------------------------------- // dwBlockLen . dwCount = fread(pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)) { HandleError(" !
"); } //------------------------------------------------------------------- // . if(!CryptEncrypt( hKey, // 0, // , feof(hSource), // , TRUE. FALSE. // 。 0, // pbBuffer, // , &dwCount, // , dwBufferLen)) //pbBuffer 。 { HandleError("Error during CryptEncrypt.
"); } //------------------------------------------------------------------- // fwrite(pbBuffer, 1, dwCount, hDestination); if(ferror(hDestination)) { HandleError(" ."); } } while(!feof(hSource)); //------------------------------------------------------------------- // if(hSource) { if(fclose(hSource)) HandleError(" !"); } if(hDestination) { if(fclose(hDestination)) HandleError(" !"); } //------------------------------------------------------------------- // . if(pbBuffer) free(pbBuffer); //------------------------------------------------------------------- // if(hKey) { if(!(CryptDestroyKey(hKey))) HandleError("Error during CryptDestroyKey"); } //------------------------------------------------------------------- // CSP if(hCryptProv) { if(!(CryptReleaseContext(hCryptProv, 0))) HandleError("Error during CryptReleaseContext"); } return(TRUE); } // end Encryptfile // HCRYPTPROV GetCryptProv() { HCRYPTPROV hCryptProv; // // if(CryptAcquireContext( &hCryptProv, // NULL, // , MS_ENHANCED_PROV, // PROV_RSA_FULL, // , 0)) // { printf(" !
"); } else { // if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { HandleError(" !"); } } return hCryptProv; } // HandleError: , , void HandleError(char *s) { printf(" !
"); printf("%s
",s); printf(" : %x.
",GetLastError()); printf(" !
"); exit(1); } // GenKeyByRandom: // :hCryptProv CSP // hDestination , HCRYPTKEY GenKeyByRandom(HCRYPTPROV hCryptProv,FILE* hDestination) { HCRYPTKEY hKey; HCRYPTKEY hXchgKey; PBYTE pbKeyBlob; DWORD dwKeyBlobLen; if(CryptGenKey( hCryptProv, ENCRYPT_ALGORITHM, KEYLENGTH | CRYPT_EXPORTABLE, &hKey)) { printf(" .
"); } else { HandleError("Error during CryptGenKey.
"); } //-------------------------------------------------------------- // if(CryptGenKey( hCryptProv, AT_KEYEXCHANGE, 0, &hXchgKey)) { printf(" .
"); } else { HandleError(" .
"); } //-------------------------------------------------------------- // , . if(CryptExportKey( hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwKeyBlobLen)) { printf(" %d .
",dwKeyBlobLen); } else { HandleError(" !
"); } if(pbKeyBlob =(BYTE *)malloc(dwKeyBlobLen)) { printf(" .
"); } else { HandleError(" .
"); } //-------------------------------------------------------------- // . if(CryptExportKey( hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwKeyBlobLen)) { printf(" .
"); } else { HandleError("Error during CryptExportKey!
"); } //-------------------------------------------------------------- // . if(hXchgKey) { if(!(CryptDestroyKey(hXchgKey))) HandleError("Error during CryptDestroyKey"); hXchgKey = 0; } //-------------------------------------------------------------- // . fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, hDestination); if(ferror(hDestination)) { HandleError(" ."); } else { printf(" .
"); } //-------------------------------------------------------------- // . fwrite(pbKeyBlob, 1, dwKeyBlobLen, hDestination); if(ferror(hDestination)) { HandleError(" "); } else { printf(" .
"); } // . free(pbKeyBlob); // return hKey; } // GenKeyByRandom: // :hCryptProv CSP // szPassword HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword) { HCRYPTKEY hKey; HCRYPTHASH hHash; //------------------------------------------------------------------- // . if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)) { printf(" .
"); } else { HandleError("Error during CryptCreateHash!
"); } //------------------------------------------------------------------- // . if(CryptHashData( hHash, (BYTE *)szPassword, strlen(szPassword), 0)) { printf(" .
"); } else { HandleError("Error during CryptHashData.
"); } //------------------------------------------------------------------- // . if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey)) { printf(" .
"); } else { HandleError("Error during CryptDeriveKey!
"); } //------------------------------------------------------------------- // . if(hHash) { if(!(CryptDestroyHash(hHash))) HandleError("Error during CryptDestroyHash"); hHash = 0; } // return hKey; }

 
우 리 는 VC + + 로 파일 복호화 를 실현 할 것 입 니 다. 코드 구현 과 설명 을 보십시오.
 
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH  0x00800000
void HandleError(char *s);
HCRYPTPROV GetCryptProv();

#define ENCRYPT_ALGORITHM CALG_RC4 
#define ENCRYPT_BLOCK_SIZE 8 
 
BOOL DecryptFile(
     PCHAR szSource, 
     PCHAR szDestination, 
     CHAR *szPassword); 

HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword);
HCRYPTKEY GenKeyFromFile(HCRYPTPROV hCryptProv,FILE* hSource);

void main(void) 
{ 
	//--------------------------------------------------------------------
	//         .

	PCHAR szSource; 
	PCHAR szDestination; 
	CHAR szPassword[100] = ""; 
	char  response;

	if(!(szSource=(char *)malloc(100)))
		HandleError("Memory allocation failed.");
	if(!(szDestination=(char *)malloc(100)))
		HandleError("Memory allocation failed.");

	printf("      . 

"); printf(" : "); fgets(szSource, 100, stdin); if(szSource[strlen(szSource)-1] == '
') szSource[strlen(szSource)-1] = '\0'; printf(" : "); fgets(szDestination, 100, stdin); if(szDestination[strlen(szDestination)-1] == '
') szDestination[strlen(szDestination)-1] = '\0'; printf(" ? ( y/n ) "); response = getchar(); if(response == 'y') { getchar(); printf(" :"); gets(szPassword); } else { printf(" .
"); } // if(!DecryptFile(szSource, szDestination, szPassword)) { printf("
Error decrypting file.
"); } else { printf("
%s .
", szSource); printf(" %s .
",szDestination); } //-------------------------------------------------------------------- // . if(szSource) free(szSource); if(szDestination) free(szDestination); } // End main //------------------------------------------------------------------- // : szSource , szDestination // : // szSource: // szDestination: // szPassword: static BOOL DecryptFile( PCHAR szSource, PCHAR szDestination, PCHAR szPassword) { //-------------------------------------------------------------------- // . FILE *hSource; FILE *hDestination; HCRYPTPROV hCryptProv; HCRYPTKEY hKey; PBYTE pbBuffer; DWORD dwBlockLen; DWORD dwBufferLen; DWORD dwCount; BOOL status = FALSE; //-------------------------------------------------------------------- // . if(!(hSource = fopen(szSource,"rb"))) { HandleError(" !"); } //-------------------------------------------------------------------- // , . if(!(hDestination = fopen(szDestination,"wb"))) { HandleError(" !"); } // hCryptProv = GetCryptProv(); // if(!szPassword|| strcmp(szPassword,"")==0 ) { //-------------------------------------------------------------------- // hKey = GenKeyFromFile( hCryptProv,hSource); } else { //-------------------------------------------------------------------- // . hKey=GenKeyByPassword( hCryptProv, szPassword); } // , ENCRYPT_BLOCK_SIZE dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; dwBufferLen = dwBlockLen; //-------------------------------------------------------------------- // . if(!(pbBuffer = (BYTE *)malloc(dwBufferLen))) { HandleError(" !
"); } //-------------------------------------------------------------------- // , do { //-------------------------------------------------------------------- // dwBlockLen . dwCount = fread( pbBuffer, 1, dwBlockLen, hSource); if(ferror(hSource)) { HandleError(" !"); } //-------------------------------------------------------------------- // if(!CryptDecrypt( hKey, 0, feof(hSource), 0, pbBuffer, &dwCount)) { HandleError("Error during CryptDecrypt!"); } //-------------------------------------------------------------------- // . fwrite( pbBuffer, 1, dwCount, hDestination); if(ferror(hDestination)) { HandleError("Error writing plaintext!"); } } while(!feof(hSource)); status = TRUE; //-------------------------------------------------------------------- // if(hSource) { if(fclose(hSource)) HandleError(" "); } if(hDestination) { if(fclose(hDestination)) HandleError(" "); } //-------------------------------------------------------------------- // if(pbBuffer) free(pbBuffer); //-------------------------------------------------------------------- // if(hKey) { if(!(CryptDestroyKey(hKey))) HandleError("Error during CryptDestroyKey"); } //-------------------------------------------------------------------- // CSP if(hCryptProv) { if(!(CryptReleaseContext(hCryptProv, 0))) HandleError("Error during CryptReleaseContext"); } return status; } // end Decryptfile // HCRYPTPROV GetCryptProv() { HCRYPTPROV hCryptProv; // // if(CryptAcquireContext( &hCryptProv, // NULL, // , MS_ENHANCED_PROV, // PROV_RSA_FULL, // , 0)) // { printf(" !
"); } else { // if(!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { HandleError(" !"); } } return hCryptProv; } // HandleError: , , void HandleError(char *s) { printf(" !
"); printf("%s
",s); printf(" : %x.
",GetLastError()); printf(" !
"); exit(1); } // GenKeyFromFile: // :hCryptProv CSP // hSource HCRYPTKEY GenKeyFromFile(HCRYPTPROV hCryptProv,FILE* hSource) { HCRYPTKEY hKey; PBYTE pbKeyBlob; DWORD dwKeyBlobLen; // , . fread(&dwKeyBlobLen, sizeof(DWORD), 1, hSource); if(ferror(hSource) || feof(hSource)) { HandleError(" !"); } if(!(pbKeyBlob = (BYTE *)malloc(dwKeyBlobLen))) { HandleError(" ."); } //-------------------------------------------------------------------- // fread(pbKeyBlob, 1, dwKeyBlobLen, hSource); if(ferror(hSource) || feof(hSource)) { HandleError(" !
"); } //-------------------------------------------------------------------- // CSP. if(!CryptImportKey( hCryptProv, pbKeyBlob, dwKeyBlobLen, 0, 0, &hKey)) { HandleError("Error during CryptImportKey!"); } if(pbKeyBlob) free(pbKeyBlob); // return hKey; } // GenKeyByPassword: // :hCryptProv CSP // szPassword HCRYPTKEY GenKeyByPassword(HCRYPTPROV hCryptProv,PCHAR szPassword) { HCRYPTKEY hKey; HCRYPTHASH hHash; //------------------------------------------------------------------- // . if(CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash)) { printf(" .
"); } else { HandleError("Error during CryptCreateHash!
"); } //------------------------------------------------------------------- // . if(CryptHashData( hHash, (BYTE *)szPassword, strlen(szPassword), 0)) { printf(" .
"); } else { HandleError("Error during CryptHashData.
"); } //------------------------------------------------------------------- // . if(CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey)) { printf(" .
"); } else { HandleError("Error during CryptDeriveKey!
"); } //------------------------------------------------------------------- // . if(hHash) { if(!(CryptDestroyHash(hHash))) HandleError("Error during CryptDestroyHash"); hHash = 0; } // return hKey; }

 
 

좋은 웹페이지 즐겨찾기