目標平台:LOONGSON-1B開發板
核心:Linux 3.0
編譯平台:ubuntu10.04
交叉工具鏈:gcc-3.4.6-2f
備忘:以下操作均在root使用者下進行
簡介
本文旨在為MD5移植以及linux C下MD5加密編程提供技術文檔。
MD5(Message Digest Algorithm 5:訊息摘要演算法第五版),為電腦安全領域廣泛使用的一種散列函數,用於提供訊息的完整性保護,是電腦廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法)。
MD5演算法接收任意長度的一個字串,然後將它散列成128位的編碼。它廣泛應用於各種電腦各種加密領域。
1、安裝MD5工具
首先下載MD5工具源碼:
進入地址: http://martin.hinner.info/libmd/
下載libmd庫libmd-0.3.tar.bz2
在ubuntu10.04安裝libmd工具:
#tar jxf libmd-0.3.tar.bz2
#cd libmd-0.3
#./configure
#make
#make install
Ubuntu10.04完成md5工具安裝。
2、交叉編譯MD5工具
備忘:若移植至arm平台則相應改為arm-linux
#cd libmd-0.3
#./configure --host=mipsel=mipsel-linux --prefix=/home/md5_install
#vi Makefile
開啟Makefile並修改:
將CC = gcc 修改為 CC = mipsel-linux-gcc
將RANLIB = ranlib 修改為 RANLIB = mipsel-linux-ranlib
將AR = ar 修改為 AR = mipsel-linux-ar
在INSTALL = /usr/bin/install -c語句下添加語句:
BUILDROOT = /home/md5_install
儲存退出Makefile
#make
#make install
安裝後在目錄/home/md5_install/下產生usr/include/、usr/lib/、usr/man等檔案夾,將交叉編譯產生的在/home/md5_install/usr/lib/libmd.so.1.0移至目標平台的/lib目錄,完成MD5移植。
3、MD5編程
Libmd提供了一系列C函數介面,通過這些介面可方便地實現MD5加密。
md5.h檔案提供了MD5編程中一個重要的結構體struct MD5Context,它的原型如下:
struct MD5Context{
u_int32_t buf[4];
U_int32_t bits[2];
Unsigned char in[64];
}MD5_CTX;
該類型結構體貫穿整個MD5編程。
3.1 MD5常用函數介面
#include <sys/types.h>#include <md5.h>void MD5Init(MD5_CTX *context);void MD5Update(MD5_CTX *context, const void *data, unsigned int len);void MD5Pad(MD5_CTX *context);void MD5Final(unsigned char digest[16], MD5_CTX *context);char *MD5End(MD5_CTX *context, char *buf);char *MD5File(const char *filename, char *buf);char *MD5FileChunk(const char *filename, char *buf, off_t offset, off_t lenghth);char *MD5Data(const void *data, unsigned int len, char *buf);
函數說明:
MD5Init(), MD5Update()和MD5Final():是核心函數,MD5編程時,先分配一個MD5_CTX結構體空間,使用MD5Init()對該結構體進行初始化,使用MD5Update()對它進行更新,最後使用MD5Final()提取結果。
MD5Pad():類似於MD5Final(),區別在於它並不會終止計算。
MD5End():是MD5Final()函數的封裝,它將轉換的128十六進位編碼轉換為一串33個字元(包含結束符'\0')的ASCII碼字串。
MD5File():計算檔案的摘要,並使用MD5End()返回結果。如果指定的檔案不能開啟,則返回NULL指標。
MD5FileChunk():函數類似於MD5File(),但它只計算檔案裡指定位移offset開始至往後length個位元組的檔案摘要。如果length為0,或者大於位移後剩餘的長度,則MD5FileChunk()計算從位移出至檔案結尾的檔案摘要。
4、MD5加密程式例子:
/*md5.c*/#include <stdlib.h>#include <string.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <md5.h>int main(void){ unsigned char passwd[10] = {0}; unsigned char sout[MD5_HASHBYTES] = {0}; int i; MD5_CTX ctx; memset(&ctx, 0, sizeof(MD5_CTX)); MD5Init(&ctx); MD5Update(&ctx, (unsigned char *)passwd,sizeof(passwd)); MD5Final((unisned char *)sout, &ctx); printf("MD5 code is:\n"); for(i = 0; i < MD5_HASHBYTES, i++) { printf("%02x ", sout[i]); } printf("\n"); return 0;}
Ubuntu本地編譯與運行:
#gcc -o md5 md5.c -lmd
#./md5
MD5 code is:
C5 6b d5 48 0f 6e 54 13 cb 6e a0 ad 96 66 61 3a
上面產生的欄位為passwd經過MD5加密後的128位編碼。
交叉編譯與運行:
#mipsel-linux-gcc -I/home/md5_install/usr/include -o md5 md5.c -L/home/md5_install/usr/lib -lmd
將可執行檔md5拷至目標平台運行可得到跟上面一樣的加密編碼。