vc++网络安全编程范例(17)-open ssl 实现文件加密与解密

本文介绍了OpenSSL在VC++中的应用,涵盖了其在网络安全编程中的角色,包括对称加密算法(如AES、DES等)、非对称加密算法(如RSA、DSA)和信息摘要算法。通过代码实现,展示了如何使用VC++结合OpenSSL库进行文件的加密和解密操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
信息摘要算法
  OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

我们来用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("加密一个文件. \n\n");
	printf("请输入需要被加密文件的名称: ");
	fgets(szSource, 100, stdin);
	if(szSource[strlen(szSource)-1] == '\n')
		 szSource[strlen(szSource)-1] = '\0';
	printf("请输入需要输出文件文件的名称: ");
	fgets(szDestination, 100, stdin);
	if(szDestination[strlen(szDestination)-1] == '\n')
		 szDestination[strlen(szDestination)-1] = '\0';
	printf("要使用密码对这个文件加密吗? ( y/n ) ");
	response = getchar();
	if(response == 'y')
	{
		printf("请输入密码:");
		getchar();
		gets(szPassword);
	}
	else
	{
		printf("密钥将生成但没有使用密码. \n");
	}

	//-------------------------------------------------------------------
	// 调用函数 EncryptFile 进行实际的加密操作.
 
	if(EncryptFile(szSource, szDestination, szPassword))
	{
		   printf("对文件 %s 的加密已经成功! \n", 
			   szSource);
		   printf("加密后的数据存储在文件 %s 中.\n",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 已经打开. \n", szSource);
	}
	else
	{ 
	   HandleError("打开原文文件出错!");
	} 

	//-------------------------------------------------------------------
	// 打开目标文件. 
	if(hDestination = fopen(szDestination,"wb"))
	{
		 printf("目标文件 %s 已经打开. \n", szDestination);
	}
	else
	{
		HandleError("打开目标文件出错!"); 
	}
	//获取加密服务者句柄
	hCryptProv = GetCryptProv();

	//-------------------------------------------------------------------
	// 创建会话密钥.
	if(!szPasswor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值