一、下载ActivePerl
配置过程中需要生成一些mak文件,这些生成代码用perl脚本生成,所以要安装一个ActivePerl.
下载路径: http://www.activestate.com/activeperl/ 下载最新的64位的即可,然后安装
二、 设置vs的环境变量
添加VS2010的环境变量,进入cdm命令行输入:
set path=%path%;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
在cmd输入:
vcvars32.bat
注:编译64位库的时候运行的是vcvars64.bat
三、编译openssl
1. 下载openssl
下载路径: http://www.openssl.org/ 下载openssl-1.0.1t.tar.gz即可
2. 编译openssl
在cmd窗口运行如下命令:
>perl Configure VC-WIN32 no-asm --prefix=c:/some/openssl/dir
> ms\do_ms
> nmake -f ms\ntdll.mak
>nmake -f ms\ntdll.mak install
可用 >nmake -f ms\ntdll.mak test 测试安装是否成功
生成dll保存在 out32dll目录下面
四、使用openssl库
<span style="font-size:14px;">// ssl_test.cpp : 定义控制台应用程序的入口点。
//
#include <iostream>
#include <openssl/md5.h>
#include <openssl/des.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
using namespace std;
int md5_test(void)
{
const char *data = "hello world"; // 原始数据
unsigned char md[16] = {0};
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, data, strlen(data));
MD5_Final(md, &ctx);
int i = 0;
char buf[33] = {0};
char tmp[3] = {0};
for(i = 0; i < 16; i++ )
{
sprintf(tmp,"%02X", md[i]);
strcat(buf, tmp);
}
cout << buf << endl; // data的md5值
return 0;
}
/************************************************************************
** 本例采用:
** 3des-ecb加密方式;
** 24位密钥,不足24位的右补0x00;
** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,...
** 本身已8位对齐的,后面补八个0x08。
************************************************************************/
int des_test(void)
{
int docontinue = 1;
char *data = "hello world!"; /* 明文 */
int data_len;
int data_rest;
unsigned char ch;
unsigned char *src = NULL; /* 补齐后的明文 */
unsigned char *dst = NULL; /* 解密后的明文 */
int len;
unsigned char tmp[8];
unsigned char in[8];
unsigned char out[8];
char *k = "01234567899876543210"; /* 原始密钥 */
int key_len;
#define LEN_OF_KEY 24
unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
unsigned char block_key[9];
DES_key_schedule ks,ks2,ks3;
/* 构造补齐后的密钥 */
key_len = strlen(k);
memcpy(key, k, key_len);
memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
/* 分析补齐明文所需空间及补齐填充数据 */
data_len = strlen(data);
data_rest = data_len % 8;
len = data_len + (8 - data_rest);
ch = 8 - data_rest;
src = (unsigned char *)malloc(len);
dst = (unsigned char *)malloc(len);
if (NULL == src || NULL == dst)
{
docontinue = 0;
}
if (docontinue)
{
int count;
int i;
/* 构造补齐后的加密内容 */
memset(src, 0, len);
memcpy(src, data, data_len);
memset(src + data_len, ch, 8 - data_rest);
/* 密钥置换 */
memset(block_key, 0, sizeof(block_key));
memcpy(block_key, key + 0, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
memcpy(block_key, key + 8, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
memcpy(block_key, key + 16, 8);
DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);
printf("before encrypt:\n");
for (i = 0; i < len; i++)
{
printf("0x%.2X ", *(src + i));
}
printf("\n");
/* 循环加密/解密,每8字节一次 */
count = len / 8;
for (i = 0; i < count; i++)
{
memset(tmp, 0, 8);
memset(in, 0, 8);
memset(out, 0, 8);
memcpy(tmp, src + 8 * i, 8);
/* 加密 */
DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)in, &ks, &ks2, &ks3, DES_ENCRYPT);
/* 解密 */
DES_ecb3_encrypt((const_DES_cblock*)in, (DES_cblock*)out, &ks, &ks2, &ks3, DES_DECRYPT);
/* 将解密的内容拷贝到解密后的明文 */
memcpy(dst + 8 * i, out, 8);
}
printf("after decrypt :\n");
for (i = 0; i < len; i++)
{
printf("0x%.2X ", *(dst + i));
}
printf("\n");
}
if (NULL != src)
{
free(src);
src = NULL;
}
if (NULL != dst)
{
free(dst);
dst = NULL;
}
return 0;
}
int main(int argc, char* argv[])
{
des_test();
return 0;
}</span>