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

vc++网络安全编程范例(16)-open 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算法则一般只用于数字签名。

 

我们来用VC++实现使用哈希编码解码数据,请见代码实现与注释讲解

 

 

 

 

#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)  

 

//函数申明   www.zzzyk.com

HCRYPTPROV GetCryptProv(); 

void HandleError(char *s); 

 

void main(void) 

 

    //变量申明及初始化  

    BYTE* pbContent = (BYTE*) "A razzle-dazzle hashed message \n" 

           "Hashing is better than trashing. \n";   // 与编码消息  

    DWORD cbContent = strlen((char *)pbContent)+1;  // 消息长度  

    HCRYPTPROV hCryptProv;                          // CSP句柄  

    DWORD HashAlgSize;                              //算法数据结构大小  

    CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;       //算法数据结构  

    CMSG_HASHED_ENCODE_INFO HashedEncodeInfo;       //哈希编码数据结构  

    DWORD cbEncodedBlob;                            //编码消息长度  

    BYTE *pbEncodedBlob;                            //编码 消息  

    HCRYPTMSG hMsg;                                 //消息句柄  

    HCRYPTMSG hDupMsg; 

    DWORD cbData = sizeof(DWORD); 

    DWORD dwMsgType; 

    DWORD cbDecoded; 

    BYTE  *pbDecoded; 

 

 

    printf("开始处理. \n"); 

    printf("要被哈希处理及编码的消息是: \n"); 

    printf("%s\n",pbContent);    // Display original message.  

    printf("起初的消息长度是%d\n",cbContent); 

 

    //获取加密提供者句柄  

    hCryptProv= GetCryptProv(); 

 

    //-------------------------------------------------------------------  

    // 初始化算法数据结构.  

 

    HashAlgSize = sizeof(HashAlgorithm); 

    memset(&HashAlgorithm, 0, HashAlgSize);   // 初始化为0  

    HashAlgorithm.pszObjId = szOID_RSA_MD5;   //指定算法为MD5哈希算法  

 

    //-------------------------------------------------------------------  

    // 初始化哈希编码数据结构  

    memset(&HashedEncodeInfo, 0, sizeof(CMSG_HASHED_ENCODE_INFO)); 

    HashedEncodeInfo.cbSize = sizeof(CMSG_HASHED_ENCODE_INFO); 

    HashedEncodeInfo.hCryptProv = hCryptProv; 

    HashedEncodeInfo.HashAlgorithm = HashAlgorithm; 

    HashedEncodeInfo.pvHashAuxInfo = NULL; 

 

    //-------------------------------------------------------------------  

    // 获取编码消息长度  

    if(cbEncodedBlob = CryptMsgCalculateEncodedLength( 

                         MY_ENCODING_TYPE,     // 编码类型  

                         0,                    // 标志位  

                         CMSG_HASHED,          // 编码消息类型  

                         &HashedEncodeInfo,    // 执行消息类型指针  

                         NULL,                  

                         cbContent))           // 预编码消息长度  

    { 

        printf("需要被分配的长度是%d 字节.\n", 

            cbEncodedBlob); 

    } 

    else 

    { 

        HandleError("获取编码消息长度失败"); 

    } 

    //-------------------------------------------------------------------  

    // 为编码消息分配空间  

    if(pbEncodedBlob = (BYTE *) malloc(cbEncodedBlob)) 

    { 

        printf("已经分配了%d 字节的空间.\n", <

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