MD5算法编成动态链接库

来源:互联网 发布:ubuntu crontab 日志 编辑:程序博客网 时间:2024/05/23 18:43
原文地址: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 chardigest[16], MD5_CTX *context);

extern "C" void __declspec(dllexport)MD5Transform (UINT4state[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 (POINTERoutput,POINTER input,unsigned int len);

extern "C" void __declspec(dllexport)MD5_memset (POINTERoutput,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'sbegin!!

#include<stdio.h>

#include<windows.h>

typedef unsigned char*POINTER;

typedef unsigned short intUINT2;

typedef unsigned long intUINT4;

typedef struct

{

  UINT4state[4];                                  

  UINT4count[2];       

  unsignedcharbuffer[64];                        

} MD5_CTX;

 

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

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

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 chardigest[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;

}