Linux下MD5移植與編程__Arduino

來源:互聯網
上載者:User

目標平台: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拷至目標平台運行可得到跟上面一樣的加密編碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.