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

📄 simpleencryptanddecrypt.cpp

📁 基于CryptoAPI的简单加解密的程序 在windowsXP
💻 CPP
字号:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif 

#include "stdio.h"
#include <windows.h>
//加密操作需要的头文件
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH  0x00800000   //密钥长度

#define ENCRYPT_ALGORITHM CALG_RC4 
#define ENCRYPT_BLOCK_SIZE 8 

//函数申明
HCRYPTPROV GetCryptProv();
void HandleError(char *s);
void ByteToStr(
     DWORD cb, 
     void* pv, 
     LPSTR sz);

//--------------------------------------------------------------------
//   Begin main.

void main(void) 
{ 
    CHAR szPlaint[100]; 
    CHAR szPassword[100]; 
	
	printf("请输入需加密的消息: ");
	gets(szPlaint);
	printf("请输入加解密密码:");
	gets(szPassword);

	//变量定义
	HCRYPTPROV hCryptProv; 
	HCRYPTKEY hKey; 
	HCRYPTHASH hHash; 
		
	PBYTE pbBuffer; 
	DWORD dwCount; 

	//获取加密提供者句柄
	hCryptProv= GetCryptProv();

	
	//--------------------------------------------------------------------
	// 创建一个会话密钥(session key)
	// 会话密钥也叫对称密钥,用于对称加密算法。
	// (注: 一个Session是指从调用函数CryptAcquireContext到调用函数
	//   CryptReleaseContext 期间的阶段。)

	//--------------------------------------------------------------------
	// 创建哈希句柄. 
	if(CryptCreateHash(
		hCryptProv, //前面创建的CSP句柄
		CALG_MD5, //使用md5摘要算法
		0, //使用密钥(针对需要密钥的摘要算法)
		0, 
		&hHash))//返回的hash句柄
    {
        printf("创建哈希句柄成功. \n");
    }
    else
    { 
		HandleError("CryptCreateHash函数执行出错!\n");
    }  

	//--------------------------------------------------------------------
	// 用输入的密码产生一个哈希值
	if(CryptHashData(
		hHash, 
		(BYTE *)szPassword, 
		strlen(szPassword), 
		0))
	{
		printf("计算输入密码的哈希值成功! \n");
	}
	else
	{
		HandleError("CryptHashData函数执行出错!\n"); 
	}

	//--------------------------------------------------------------------
	// 通过哈希值生成会话密钥(session key)
	if(CryptDeriveKey(
		hCryptProv,         //前面创建的CSP句柄
		ENCRYPT_ALGORITHM,  //rc4算法 ,这里需注意CSP是否支持此算法
		hHash,              //前面创建的hash句柄
		KEYLENGTH, 
		&hKey))
	{
		printf("从密码哈希值创建加解密密钥成功! \n"); 
	}
	else
	{
		HandleError("CryptDeriveKey函数执行出错!\n"); 
	}

	

	pbBuffer = (BYTE *)szPlaint;
	dwCount = strlen(szPlaint);
	printf("加密前数据为: ");
	printf("%s\n",(char*)pbBuffer);
	//--------------------------------------------------------------------
	// 加密数据
	if(!CryptEncrypt(
		hKey,			//密钥
		0,				//如果数据同时进行哈希和加密,这里传入一个哈希对象
		true,	        //如果是最后一个被加密的块,输入TRUE.如果不是输入FALSE.						
		0,				//保留
		pbBuffer,		//输入需加密数据,输出加密后的数据
		&dwCount,		//输入需加密数据实际长度,输出加密后数据长度
		dwCount))	    //pbBuffer的大小。
	{ 
		HandleError("CryptEncrypt函数执行出错. \n"); 
	} 

	char EncryptedString[1000];
	
	ByteToStr(
		dwCount, 
		pbBuffer, 
		EncryptedString);
	printf("加密后数据为: ");
	printf("%s\n",EncryptedString);

	// 解密数据 
	if(!CryptDecrypt(
		hKey,          //密钥
		0,             //如果数据同时进行哈希和解密,这里传入一个哈希对象
		true,          //如果是最后一个被加密的块,输入TRUE.如果不是输入FALSE.	
		0,             //保留
		pbBuffer,      //输入加密后数据,输出解密后的原文
		&dwCount))     //输入加密后数据的实际长度,输出解密后原文数据长度
	{
		HandleError("CryptDecrypt函数执行出错!"); 
	}

	printf("解密后数据为: ");
	printf("%s\n",(char*)pbBuffer);
	
	//--------------------------------------------------------------------
	// 释放内存. 	
	if(pbBuffer) 
		pbBuffer=NULL;   

	CryptDestroyHash(hHash); //销毁hash句柄 释放空间
	hHash = NULL; 
	
	//--------------------------------------------------------------------
	// 销毁密钥. 	
	if(hKey) 
		CryptDestroyKey(hKey); 

	
	//--------------------------------------------------------------------
	// 释放CSP句柄	
	if(hCryptProv) 
		CryptReleaseContext(hCryptProv, 0);	
	
} // End of main



//获取加密提供者句柄
HCRYPTPROV GetCryptProv()
{
	HCRYPTPROV hCryptProv;                      // 加密服务提供者句柄
	
	//获取加密提供者句柄
	if(CryptAcquireContext(
				&hCryptProv,         // 加密服务提供者句柄
				NULL,                // 密钥容器名,这里使用登陆用户名
				NULL,                // 加密服务提供者,这里取默认值   
				PROV_RSA_FULL,       // 加密服务提供者类型,可以提供加密和签名等功能
				0))                  // 标志
	{
		printf("加密服务提供者句柄获取成功!\n");
	}
	else
	{
		
  
		//重新建立一个新的密钥集
	    if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
		{
		   HandleError("重新建立一个新的密钥集出错!");
		}
 
	}
	return hCryptProv;
}

//  HandleError:错误处理函数,打印错误信息,并退出程序
void HandleError(char *s)
{
    printf("程序执行发生错误!\n");
    printf("%s\n",s);
    printf("错误代码为: %x\n.",GetLastError());
    printf("程序终止执行!\n");
    exit(1);
}

//--------------------------------------------------------------------
// ByteToStr:  转换BYTE类型数组为字符串
//参数:cb[in]  需要转换的BYTE数组的长度
//      pv[in]  需要转换的BYTE数组指针
//      sz[out] 字符串指针
void ByteToStr(
     DWORD cb, 
     void* pv, 
     LPSTR sz)
{
	BYTE* pb = (BYTE*) pv; 
	DWORD i;               
	int b;                 

	for (i = 0; i<cb; i++)
	{
		//pb的前4位转换为字符
	    b = (*pb & 0xF0) >> 4;
	    *sz++ = (b <= 9) ? b + '0' : (b - 10) + 'A';
	    //pb的后4位转换为字符
		b = *pb & 0x0F;
	    *sz++ = (b <= 9) ? b + '0' : (b - 10) + 'A';
	    pb++;
	}
	*sz++ = 0;
}

⌨️ 快捷键说明

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