MD5算法编成动态链接库

原文地址:MD5算法编成动态链接库 作者:阿土

一、建立动态链接库:

[转载]MD5算法编成动态链接库

(以下涉及到的md5.h文件,global.h文件和md5.cpp的详细内容请参考前一篇博文---MD5算法)

1.       建立头文件md5.h,是原来老师给的md5.h的内容,只不过把函数限制static去掉了。

2.       然后建立头文件global.h,其内容也是原来的内容去掉static修饰。

3.       建立头文件lib.h,内容为:

#include "global.h"

#include "md5.h"

#ifndef LIB_H

#define LIB_H

extern "C" void __declspec(dllexport)Encode (unsigned char *output,UINT4 *input,unsigned int len);

extern "C" void __declspec(dllexport)MD5Init(MD5_CTX *);

extern "C" void __declspec(dllexport)MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);

extern "C" void __declspec(dllexport)MD5Final(unsigned char digest[16], MD5_CTX *context);

extern "C" void __declspec(dllexport)MD5Transform (UINT4 state[4],unsigned char block[64]);

extern "C" void __declspec(dllexport)Decode (UINT4 *output,unsigned char *input,unsigned int len);

extern "C" void __declspec(dllexport)MD5_memcpy (POINTER output,POINTER input,unsigned int len);

extern "C" void __declspec(dllexport)MD5_memset (POINTER output,int value,unsigned int len);

#endif

4.建立文件md5.cpp,其内容为原来内容,只不过把原来的#include "global.h"

#include "md5.h"去掉了,然后加上了#include "lib.h"

5.编译然后在工程的Debug目录下生成了MD5DLL.dllMD5DLL.lib文件(这两个重要)

[转载]MD5算法编成动态链接库



二、编写测试的main函数

建立工程之前,先要把以上生成的MD5DLL.dllMD5DLL.lib文件考到本工程目录下,现在开始编写main函数吧,now ,let's begin!!

#include <stdio.h>

#include <windows.h>

typedef unsigned char *POINTER;

typedef unsigned short int UINT2;

typedef unsigned long int UINT4;

typedef struct

{

  UINT4 state[4];                                   

  UINT4 count[2];       

  unsigned char buffer[64];                        

} MD5_CTX;

 

typedef void (*pMD5Init)(MD5_CTX *context);  //宏定义函数指针类型

typedef void (*pMD5Update)(MD5_CTX *context,unsigned char *input,unsigned int inputlen);

typedef void (*pMD5Final)(unsigned char digest[16], MD5_CTX *context);

 

int main(int argc, char *argv[])

{

       HINSTANCE hDll; //DLL句柄

       //函数指针

       pMD5Init MD5Init;

       pMD5Update MD5Update;

       pMD5Final MD5Final;

 

       hDll = LoadLibrary("..\MD5DLL.dll");

       if (hDll != NULL)

       {

              MD5Init = (pMD5Init) GetProcAddress(hDll, "MD5Init");

              MD5Update = (pMD5Update) GetProcAddress(hDll, "MD5Update");

              MD5Final = (pMD5Final) GetProcAddress(hDll, "MD5Final");

      

              int i;

              unsigned char encrypt[200];

              unsigned char decrypt[17];

              MD5_CTX md5;

 

              MD5Init(&md5);

              printf("请输入字符串:");

              scanf("%s",encrypt);

              MD5Update(&md5,encrypt,strlen((char*)encrypt));

              MD5Final(decrypt,&md5);

 

              for(i=0;i<16;i++)

              printf("%2x",decrypt[i]);

              printf("n");

 

              FreeLibrary(hDll);

       }

       return 0;

}

编译后,就可看到动态链接库的使用成功,其结果与MD5算法中在md5.c中写main函数的效果一样。


三、另外一种调用方法:

    将上面的生成的MD5DLL.lib拷贝到新创建的工程目录下,然后工程--》设置--》链接--》对象/库模块中添加MD5DLL.lib,然后就可以开始编写自己的main函数了,开始吧!

#include <stdio.h>

#include <windows.h>

typedef unsigned char *POINTER;

typedef unsigned short int UINT2;

typedef unsigned long int UINT4;

typedef struct 

{

UINT4 state[4];                                  

UINT4 count[2];        

unsigned char buffer[64];                        

} MD5_CTX;

extern "C" __declspec(dllimport) MD5Init(MD5_CTX *context);  //宏定义函数指针类型

extern "C" __declspec(dllimport) MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);

extern "C" __declspec(dllimport) MD5Final(unsigned char digest[16], MD5_CTX *context);

int main(int argc, char* argv[])

{

int i;

unsigned char encrypt[200];

unsigned char decrypt[17];

MD5_CTX md5;

MD5Init(&md5);

printf("请输入一个字符串:");

scanf("%s",encrypt);

MD5Update(&md5,encrypt,strlen((char*)encrypt));

MD5Final(decrypt,&md5);

printf("得到的MD5码是:");

for(i=0;i<16;i++)

printf("%2x",decrypt[i]);

printf("n");

return 0;

}





C版本MD5库 参考README.md 内容 #file list makefile #编译文件 md5.c md5.h test_md5_hash.c #测试样例文件 README.md #帮助文件 ========== 该库目前仅仅支持Gun/Linux/Unix 系列的编译 若是winxp/win7/win8 系列请自己包含进去,或者自己重新打包 代是从bPostgreSQL中的库文件copy出来的,经过自己的测试,重新提取打包出来的 目前这个库的代是在 PG 的 8.5RS 里面用的 MD5 返回的是一个 32位的消息hash因此需要一个char 类型的返回buf query_md5 =(char *)malloc(33); 函数调用 md5_hash(argv[1],query_len,query_md5); argv1 需要加密的数据 argv2 加密数据长度 argv3 密文 MD5.c 里面其他函数不常用,有兴趣的自己看一下吧,注释是用英文写的,基本上都能看 懂,不能看懂的,Google翻译一下就行了 自己的文件编译已测试样例文件为例 make后同时生成静态库和动态库 libminmd5.a 静态库 libminmd5.so 动态库 1、静态库的用法 gcc -o test test_md5_hash.c -L. -lminmd5 -I. -L #库文件的路径, -l #库名字,通常情况下就是 去掉后缀和前缀lib的名字 -I #头文件的路径 PS:动态库和静态库文件同名的建议不要放在一起,不然 ld的时候有可能找错文件 2、动态库的用法 gcc -o test test_md5_hash.c -g -L. -lminmd5 -I. 编译完后,建议将so 文件copy 到/usr/lib 然后执行 ldconfig 或者写死一点 gcc -o test test_md5_hash.c -g -L. -lminmd5 -I. -Wl,-rpath,. -Wl,-rpath,. #告诉ld 从本地找库(W后面是L小写的),rpath里面接的是库文件存在 的路径,正常应用建议用第一种方案,第二种方案在写小测试程序的时候,可以考虑。 至于选静态库还是动态库,就看具体应用场景了,静态库的坏处是把库代编译进去了, 若是程序按字节收费还是可以的,(PS,吐槽那个写了一个10w,10G的程序中国神童)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值