OpenSSL的VC编程 – MD5

    由于诸多原因,前几天抽了点时间在网上找了一些OpenSSL的资料。网上的资料鱼龙混杂,我看原创的并不多。部分资料是讲OpenSSL命令行的操作,另一部分(基本上转载的那样一两篇)是Linux下的OpenSSL的API。

    忍不住吐槽几句了。我见的90%的文章,都在说怎么怎么编译安装OpenSSL,然后使用的话就没下文了。难道你们的水平就仅限于安装它?安装软件不是小学初中就应该知道的东西吗?我看大部分人根本就是转载,就是充斥着转载的垃圾站。转载就算了,转载完了也不看看是否完整,是否可行。源码缺胳膊少腿,你特么这就是在祸害下一代。

    好吧,回到正题。OpenSSL是一个开源的库,封装了常用的(基本上是所有的)加密、解密的算法,让使用者不再苦恼于算法的编写(不是每个人都有数学家的大脑),直接运用库里的函数,就能简单地对数据进行加密、解密。

    我一直是喜欢Windows系统的,最重要的原因就是Visual Studio。它让程序的编写变的直观,容易百倍。OpenSSL的编译网上文章比较多,不过我今天用到的是一个叫“Win32 OpenSSL”的第三方版本。它就是一个编译好的OpenSSL(无命令行功能),而且其中有专为VC编译的库(Lib以及Dll),省去了我们很多麻烦。

    于是结合他们,我们将可以在5分钟的时间里,写出一个MD5加密的程序。


    1.下载并安装Win32 OpenSSL。安装目录中有以下几个文件夹:bin、exp、include、lib,大家应该不陌生,猜都知道该怎么用。不过还是先看看文档,打开目录下的“OpenSSLhelp.chm”。

    其中有这么一段可以参考:

    OpenSSL is designed to build easily under Microsoft
Visual C++. However, the requirement that you go and obtain the 25MB Win98 DDK
and have the latest service pack (SP5 is 120MB) installed can prove to be a
hinderance to some people (particularly those with modems).

    So, the
installation of the Win32 OpenSSL binaries is a fairly simple process (similar
to the Borland C++ Builder process).

The first thing to do (assuming a
default installation of ‘C:OpenSSL’) is to go to ‘C:OpenSSLlibVC’ and copy
all of the files to your Visual C++ ‘lib’ directory. This directory is sometimes
located in a somewhat cryptic location such as ‘C:Program FilesMicrosoft
Visual StudioVC98lib’ or ‘C:Program FilesMicrosoft Visual
C++lib’.

    Next, copy everything in the ‘C:OpenSSLinclude’ directory to
your Visual C++ ‘include’ directory.

    That’s it! You are ready to go write
OpenSSL-capable code! 

    不过我没按它的来做。

    2.新建工程,选择工程 – 属性 – 配置属性 – VC++目录:

01.jpg

    3.开始写代码。首先

#include <openssl/md5.h>

#pragma comment(lib, "ssleay32MDd.lib")
#pragma comment(lib, "libeay32MDd.lib")

    md5的头文件,以及OpenSSL的静态库。这里说明一下,什么编译模式包含什么静态库。比如默认的“多线程调试DLL”,就是ssleay32MDd.lib。写过Windows程序的都应该清楚。编译模式在这里改:

02.jpg

    4.封装函数:

int MD5(const char * data, char * buf)
{
	MD5_CTX ctx;
	unsigned char md[16];
	char tmp[3]={''};
	int i;

	MD5_Init(&ctx);
	MD5_Update(&ctx,data,strlen(data));
	MD5_Final(md,&ctx);

	for( i=0; i<16; i++ ){
		sprintf(tmp,"%02x",md[i]);
		strcat(buf,tmp);
	}
	return 0;
}

    简单的不行。其中用到3个OpenSSL中的API,MD5_Init初始化一个MD5_CTX结构。MD5_Update开始加密,第一个参数是MD5_CTX结构,第二个参数是待加密的字符串,第三个参数它的长度。(注意是长度,不是缓冲区大小,用strlen取

    MD5_Final函数,用来取加密好的MD5散列。第一个参数是散列存放的缓冲区,第二个参数是MD5_CTX结构。取到MD5散列以后,最后一个for循环将它转换成十六进制字符串,这里就不多说了。

    最后得到一个长度为32的字符串,保存在buf中。

    5.写一个main函数测试结果:

int _tmain(int argc, _TCHAR* argv[])
{
	char szBuf[1024] = {0}, szMd5[50] = {0};
	gets_s(szBuf, _countof(szBuf));
	MD5(szBuf, szMd5);
	printf("%sn",szMd5);
	return 0;
}

    结果如下图:

03.jpg

    成功将https://www.leavesongs.com转换成了MD5散列。


    今天给大家看的这个运用OpenSSL加密md5散列的例子还只是OpenSSL的冰山一角,OpenSSL可以进行对称加密、非对称加密、数字签名、交换密钥……你能想到的几乎都有。而且——依旧是这样简单。

相关推荐: YIT-CTF(一) WEB类wp

        偶然发现的一个CTF网站,好像是燕京理工学院的一个小比赛,题目不是很多,也不是很难,适合新人入门CTF,以下附上这个小型CTF的wp,题目地址:传送门 1.签到题 签到题总是很简单,可是这种简单程度第一次见。。。连动都不动的,直接告诉答案。。 …

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论