openssl 编译(32位 64位)

一、下载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>





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值