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一共实现了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 进行实际的加密操作. www.zzzyk.com
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(h
补充:综合编程 , 安全编程 ,