环境
XP 32位 VS2010
一、
下载ActivePerl
网址:http://downloads.activestate.com/ActivePerl/
进入网站后截图如下:
点击releases/,进入如下界面:
在上图中选择你想要下载一个版本,我下载的是最后一个5.20.1.2000,点击进去如下图:
我们是WIN7,32位的环境,因此我们选择ActivePerl-5.20.1.2000-MSWin3-x86-64int-298577.msi,这个是直接安装的文件
二、下载openssl源码
网址:http://www.openssl.org/source/
进入网址后界面如下:
我选择了最新的release版本,openssl-1.0.1j.tar.gz下载,之后解压即可。
三、开始菜单找到VS2010文件夹---->Visual studio tools---->Visual studio 命令提示符(2010)
四、进入openssl解压后的源码文件夹
分别执行如下命令:
perl Configure VC-WIN32
msdo_ms
nmake -f ms
tdll.mak
需要注意的是如果需要生产静态库,则把上面的第三句改为如下
nmake -f ms
t.mak
五、编译结束后会在openssl目录下生产out32dll目录下生产两个dll两个lib库,如果生产的是静态库那么生产的库在out32目录下的两个lib文件。
下面测试openssl,分为动态库测试和静态库测试:
// 动态库测试
nmake -f ms
tdll.mk test
// 安装动态库
nmake -f ms
tdll.mk install
// 静态库测试
nmake -f ms
t.mk test
// 安装静态库
nmake -f ms
t.mk install
如果想修改动态库或者静态库的安装目录,请找到openssl目录下ms目录,修改nt.mk或者ntdll.mk文件的如下内容:
默认路径如下(可以修改为自己的安装路径):
INSTALLTOP=usrlocalssl
OPENSSLDIR=usrlocalssl
六、编译所用的头文件在openssl源码的include目录下
如果使用VS2010来测试openssl,那么请执行如下动作:
1、将openssl目录下include目录下的openssl目录复制到VS2010的安装目录下的VC目录下的include目录内,这样便可以随意的包含openssl的头文件了!!!
七、VS2010测试静态库过程
1、新建一个WIN32的控制台应用程序testopenssl
2、将out32目录下的libeay32.lib和ssleay32.lib复制到工程根目录
3、设置VS2010:项目---->项目属性---->VC++目录,将库目录栏添加引用的libeay32.lib和ssleay32.lib,如下图
4、代码如下:
// testopenssl.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opensslaes.h"
#include "openssl
and.h"
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
static void hexdump(
FILE *f,
const char *title,
const unsigned char *s,
int l)
{
int n = 0;
fprintf(f, "%s", title);
for (; n < l; ++n) {
if ((n % 16) == 0) {
fprintf(f, "
%04x", n);
}
fprintf(f, " %02x", s[n]);
}
fprintf(f, "
");
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char rkey[16];
AES_KEY key;
unsigned char plaintext[AES_BLOCK_SIZE * 4] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i',
'0', '1', '2', '3', '4', '5', '6', '7', '0', '1', '2', '3', '4', '5', '6', '7',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i',
'0', '1', '2', '3', '4', '5', '6', '7', '0', '1', '2', '3', '4', '5', '6', '7'
};
unsigned char ciphertext[AES_BLOCK_SIZE * 4];
unsigned char checktext[AES_BLOCK_SIZE * 4];
// Init vector.
unsigned char iv[AES_BLOCK_SIZE * 4];
// Save vector.
unsigned char saved_iv[AES_BLOCK_SIZE * 4];
int nr_of_bits = 0;
int nr_of_bytes = 0;
// Zero buffer.
memset(ciphertext, 0, sizeof ciphertext);
memset(checktext, 0, sizeof checktext);
//Generate random
RAND_pseudo_bytes(rkey, sizeof rkey);
RAND_pseudo_bytes(saved_iv, sizeof saved_iv);
hexdump(stdout, "== rkey ==",
rkey,
sizeof(rkey));
hexdump(stdout, "== iv ==",
saved_iv,
sizeof(saved_iv));
printf("
");
hexdump(stdout, "== plaintext ==",
plaintext,
sizeof(plaintext));
printf("
");
//Entrypt
memcpy(iv, saved_iv, sizeof(iv));
nr_of_bits = 8 * sizeof(rkey);
AES_set_encrypt_key(rkey, nr_of_bits, &key);
nr_of_bytes = sizeof(plaintext);
AES_cbc_encrypt(plaintext,
ciphertext,
nr_of_bytes,
&key,
iv,
AES_ENCRYPT);
hexdump(stdout, "== ciphertext ==",
ciphertext,
sizeof(ciphertext));
printf("
");
// [yasi] iv is changed in encryption
hexdump(stdout, "== iv changed ==",
iv,
sizeof(iv));
printf("
");
//Decrypt
memcpy(iv, saved_iv, sizeof(iv)); // [yasi] without this line, decrypt will fail because iv is changed in encryption
nr_of_bits = 8 * sizeof(rkey);
AES_set_decrypt_key(rkey, nr_of_bits, &key);
nr_of_bytes = sizeof(ciphertext);
AES_cbc_encrypt(ciphertext,
checktext,
nr_of_bytes,
&key, iv,
AES_DECRYPT);
hexdump(stdout, "== checktext ==",
checktext,
sizeof(checktext));
printf("
");
system("pause");
return 0;
}
5、运行结果如下: