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", <
补充:综合编程 , 安全编程 ,