⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cryptography.cpp

📁 电脑编程技巧和源码。很不错的。
💻 CPP
字号:
// Encrypt.cpp : implementation file
//

#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdafx.h"
#include "wincrypt.h"
#include "Cryptography.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
   // defines for RC4 stream cipher
#define ENCRYPT_ALGORITHM	CALG_RC4

/////////////////////////////////////////////////////////////////////////////
// CCryptography

CCryptography::CCryptography(char* pSourceFile,char* pDestFile)
{
	m_pSourceFile=pSourceFile;
	m_pDestFile=pDestFile;
}

CCryptography::~CCryptography()
{
}


BEGIN_MESSAGE_MAP(CCryptography, CWnd)
	//{{AFX_MSG_MAP(CCryptography)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CCryptography message handlers
BOOL CCryptography::CreateKeyContainer()
{
	HCRYPTPROV hProv;
	HCRYPTKEY hKey;
	unsigned char * szUserName;
	DWORD dwUserNameLen=100;
	CString tmpStr;
	//获取默认密钥容器的句柄,若无则创建容器
	if(!CryptAcquireContext(&hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,0))
	{
		CryptAcquireContext(&hProv,NULL,MS_DEF_PROV,PROV_RSA_FULL,CRYPT_NEWKEYSET);
		CryptGetProvParam(hProv,PP_CONTAINER,szUserName,&dwUserNameLen,0);
	}
	//获取签名密钥句柄,若无则创建签名密钥对
	if(!CryptGetUserKey(hProv,AT_SIGNATURE,&hKey))
	{
		if(GetLastError()==NTE_NO_KEY)
		{
		CryptGenKey(hProv,AT_SIGNATURE,0,&hKey);
		CryptDestroyKey(hKey);
		}
		else
		{
		tmpStr.Format("Error CryptGenUserKey:0x%x",GetLastError());
		AfxMessageBox(tmpStr);
		}
	}
	//获取密钥交换密钥句柄,若无则创建交换密钥对
	if(!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKey))
	{
		if(GetLastError()==NTE_NO_KEY)
		{
		CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hKey);
		CryptDestroyKey(hKey);
		}
		else
		{
		tmpStr.Format("Error CryptGenUserKey:0x%x",GetLastError());
		AfxMessageBox(tmpStr);
		}
	}
	CryptReleaseContext(hProv,0);
	return(TRUE);
}


BOOL CCryptography::EncryptFile()
{
	FILE *pSource=NULL;
	FILE *pDest=NULL;
	INT eof=0;
    HCRYPTPROV hProv   = 0;
    HCRYPTKEY hKey     = 0;
    HCRYPTKEY hXchgKey = 0;
    
    PBYTE pbKeyBlob = NULL;
    DWORD dwKeyBlobLen;

    PBYTE pbBuffer = NULL;
    DWORD dwBufferLen;
    DWORD dwCount;

    BOOL status = FALSE;

    // 打开源目标文件,错误处理转done,这里都省略
    pSource = fopen(m_pSourceFile,"rb");
    pDest= fopen(m_pDestFile,"wb");

    //获取默认密码服务提供商(CSP)
    CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
	
	//创建会话密钥,获取公钥句柄,加密密钥称为隐码
	CryptGenKey(hProv, ENCRYPT_ALGORITHM, CRYPT_EXPORTABLE, &hKey);

	CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hXchgKey);

	// 判断隐码大小并分配内存
	CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, NULL, &dwKeyBlobLen);

	pbKeyBlob = (unsigned char*)malloc(dwKeyBlobLen);

	// 输出会话密钥到隐码并释放公钥句柄
	CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, pbKeyBlob, &dwKeyBlobLen);

	CryptDestroyKey(hXchgKey);
	hXchgKey = 0;

	//向目标文件传递隐码
	fwrite(&dwKeyBlobLen, sizeof(DWORD), 1, pDest);
	fwrite(pbKeyBlob, 1, dwKeyBlobLen, pDest);
	
	// 采用流密码加密,块长为1,并分配内存
	dwBufferLen = 1;
    pbBuffer =(unsigned char *) malloc(dwBufferLen);
    //加密源文件并写向目标文件
    do {
		dwCount = fread(pbBuffer, 1, 1, pSource);
		eof = feof(pSource);
		CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, dwBufferLen);
		fwrite(pbBuffer, 1, dwCount, pDest);
	    } while(!feof(pSource));
    status = TRUE;
    
	//done:
    //关闭文件,释放内存,撤消会话密钥、公钥和CSP
    if(pSource) fclose(pSource);
    if(pDest) fclose(pDest);
    if(pbKeyBlob) free(pbKeyBlob);
    if(pbBuffer) free(pbBuffer);
    if(hKey) CryptDestroyKey(hKey);
    if(hXchgKey) CryptDestroyKey(hXchgKey);
    if(hProv) CryptReleaseContext(hProv, 0);
    return(status);
} 	


BOOL CCryptography::DecryptFile()
{
	FILE *pSource=NULL;
	FILE *pDest=NULL;
	INT eof=0;
    HCRYPTPROV hProv   = 0;
    HCRYPTKEY hKey     = 0;
    HCRYPTKEY hXchgKey = 0;
    
    PBYTE pbKeyBlob = NULL;
    DWORD dwKeyBlobLen;

    PBYTE pbBuffer = NULL;
    DWORD dwBufferLen;
    DWORD dwCount;

    BOOL status = FALSE;

    // 打开加密文件和解密文件,错误处理转done,这里都省略
    pSource = fopen(m_pSourceFile,"rb");
    pDest= fopen(m_pDestFile,"wb");

    //获取密码服务提供商(CSP)句柄,用保存的会话密钥解密文件
    CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
	
	//获取加密文件中的隐码,将其输入CSP
	fread(&dwKeyBlobLen,sizeof(DWORD),1,pSource);
	pbKeyBlob = (unsigned char*)malloc(dwKeyBlobLen);
	
	fread(pbKeyBlob,1,dwKeyBlobLen,pSource);

	CryptImportKey(hProv, pbKeyBlob,dwKeyBlobLen,0,0,&hKey);

	// 采用流密码加密,块长为1,并分配内存
	dwBufferLen = 1;
    pbBuffer =(unsigned char *) malloc(dwBufferLen);
    //解密加密文件并写向解密文件
    do {
		dwCount = fread(pbBuffer, 1, 1, pSource);
		eof = feof(pSource);
		CryptEncrypt(hKey, 0, eof, 0, pbBuffer, &dwCount, dwBufferLen);
		fwrite(pbBuffer, 1, dwCount, pDest);
	    } while(!feof(pSource));
    status = TRUE;
    
	//done:
    //关闭文件,释放内存,撤消会话密钥、公钥和CSP
    if(pSource) fclose(pSource);
    if(pDest) fclose(pDest);
    if(pbKeyBlob) free(pbKeyBlob);
    if(pbBuffer) free(pbBuffer);
    if(hKey) CryptDestroyKey(hKey);
    if(hXchgKey) CryptDestroyKey(hXchgKey);
    if(hProv) CryptReleaseContext(hProv, 0);
    return(status);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -