📄 cryptography.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 + -