当前位置:编程学习 > VC++ >>

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

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,