嵌入式演算法9 MD5的應用與實現

2021-10-10 05:42:36 字數 3462 閱讀 8534

md5資訊摘要演算法(md5 message-digest algorithm),一種被廣泛使用的密碼雜湊函式,可以產生出乙個128位(16位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。輸入任意長度的資料經過處理,輸出都是128位的資訊(數字指紋)。

不同的輸入得到的不同的結果,在有限範圍內是唯一的,畢竟字元的組合是無限的,大於2^128種。md5加密過程是乙個有損的加密過程,幾乎不能還原出原始資料。

md5.h

#ifndef md5_h

#define md5_h

typedef

struct

md5_ctx;

#define f(x,y,z) ((x & y) | (~x & z))

#define g(x,y,z) ((x & z) | (y & ~z))

#define h(x,y,z) (x^y^z)

#define i(x,y,z) (y ^ (x | ~z))

#define rotate_left(x,n) ((x << n) | (x >> (32-n)))

#define ff(a,b,c,d,x,s,ac) \

#define gg(a,b,c,d,x,s,ac) \

#define hh(a,b,c,d,x,s,ac) \

#define ii(a,b,c,d,x,s,ac) \

extern

void

md5init

(md5_ctx *context)

;extern

void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

;extern

void

md5final

(md5_ctx *context,

unsigned

char digest[16]

);#endif

// md5_h

md5.c

#include

"md5.h"

static

void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

);static

void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

;static

void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

;unsigned

char padding=

;static

void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

}static

void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

}static

void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

)void

md5init

(md5_ctx *context)

void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

context->count[1]

+= inputlen >>29;

if(inputlen >= partlen)

index =0;

}else

memcpy

(&context->buffer[index]

,&input[i]

,inputlen-i);}

void

md5final

(md5_ctx *context,

unsigned

char digest[16]

)

應用範例

#include

#include

#include

#include

"md5.h"

extern

void

md5init

(md5_ctx *context)

;int

main

(int argc,

char

*ar**)

;unsigned

char md5[16]

; md5_ctx md5handle;

md5init

(&md5handle)

;md5update

(&md5handle,source,

strlen

(source));

md5final

(&md5handle,md5)

;printf

("md5:");

for(i=

0;i<

16;i++

)printf

("\r\n");

return0;

}

輸出:

md5:8fef6276b43cfd4934bb1e5e44a3b92b

md5碼在部分情況下不屬於加密演算法,因為md5是摘要提取處理,無法根據md5碼解密出原資料,即使有破解,也只是通過窮舉字元組合的方式,建立了明文密文對應表實現,根據md5倒推出明文。如md5碼為8fef6276b43cfd4934bb1e5e44a3b92b,可以破解出原資料是"gongzhonghao:embedded-system",前提是儲存有n多明文及其md5,暴力匹配。

md5標準是128位,採用16進製表示是16位元組,即32個字元,有時為了簡便,拋棄前後各8個字元,取正中間的16個字串,記為md5-16。

嵌入式中的stateflow入門 與應用層互動

結構,一般嵌入式系統都會有個os。下面只分析應用層 os會給功能任務分配時間片,例如10ms 2ms 5ms,這個時間片對於stateflow的tick,也就是stateflow生成的函式多長時間被呼叫一次 os會給應用層開發任務的藉口函式,來讓我們實現mcu的輸入與輸出的功能,以10ms為例,下面...

嵌入式軟體與應用軟體的區別

平台開發種類不同。嵌入式系統開發是對於除了電腦之外的所有電子裝置上作業系統的開發,開發物件有手機,掌上電腦,機電系統等 軟體開發一般是用某種程式語言來實現的,通常採用軟體開發工具可以進行開發,軟體分為系統軟體和應用軟體,並不只是包括可以在計算機上執行的程式。工具使用不 同。嵌入式系統開發需要與底層的...

嵌入式linux應用的製作與韌體燒錄的概述

僅概述,不對細節進行過多描述 不同的晶元平台,細節也會略有不同,多說無益 文章只有乙個目的,就是對於新接觸linux soc平台的人,幫助他們明確目標,清晰思路,以便更迅速的切入到工作中 很明顯,為了讓乙個晶元工作起來,晶元需要程式。首先,針對第乙個問題,嵌入式linux的soc,整體架構,從操作的...