hash演算法原理之md5過程

2021-08-20 03:51:24 字數 3675 閱讀 8758

進製數零一

二三四五

六七**

十十一十二十三

十四十五十六…

十進位制012

3456

78910

111213…

二進位制0110

11100

101110

111…

十六進製制01

2345

6789

abcd

ef10…

計算機的儲存單位為位元組,乙個位元組對應8個二進位制位,共可以表示2^8也就是256種狀態。若表示數的話,最多只能表示256個數。

如乙個位元組可以表示非負整數的0~255,而表示更大的數,則需要占用多個位元組,如表示256至少需要兩個位元組。

256的二進位制形式為0000000100000000。這樣在計算機儲存上就存在乙個問題:是先儲存00000001這個位元組,還是先儲存00000000這個位元組呢?實際上,採用這兩種儲存方式的都有,取決於cpu架構和編譯器。這就引出了位元組序的概念。

小端位元組序(little endian):低位位元組存放在低記憶體位址,高位位元組存放在高記憶體位址端。

大端位元組序(big endian):高位位元組存放在低記憶體位址,低位位元組存放在高記憶體位址端。

256作為無符號數在計算機記憶體中的儲存:

位元組序低位址 ————> 高位址

小端0000000000000001

大端0000000100000000

接下來這篇文章的所有關於儲存的描述都是基於小端位元組序的,記憶體位址都是從左往右從低到高的,而且帶[儲存]字樣。(這很關鍵)

如:0000000100000010 [儲存] 表示的是十六進製制的0x201,十進位制的513,二進位制的1000000001b

(乙個數以0x開頭意味著這個數是採用的十六進製制,以b結尾意味著採用二進位制)

0110100001100101011011000110110001101111[儲存]

(這和utf-8編碼的字串」hello」,在記憶體中的儲存是一樣的。)

md5演算法就像乙個函式,任意乙個二進位制串都可以作為自變數進入這個「函式」,然後會出來乙個固定為128位的二進位制串。
0110100001100101011011000110110001101111[儲存]

進行二進位制位補充。具體這樣補充:

從這40位的後面開始,先補充乙個1位,再補充0位,一直到總共448位長度(也就是補充407個0位)。接著在後面寫入原始首席資訊官度與2^64的模。也就是40mod(2^64)=40,40轉化為2進製為101000,用64儲存就是:

0010100000000000000000000000000000000000000000000000000000000000 [儲存]

二進位制位補充完成。

得到內容(共512位):

01101000011001010110110001101100011011111 (407個0)0010100000000000000000000000000000000000000000000000000000000000 [儲存]

然後對這個512個位平均分成16組,每組32個位:
第1組:01101000011001010110110001101100

第2組:01101111100000000000000000000000

… 第32組:00000000000000000000000000000000

然後使用四個常數進行運算,分別是:

a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476。

a:00000001001000110100010101100111 [儲存]

b:10001001101010111100110111101111 [儲存]

c:11111110110111001011101010011000 [儲存]

d:01110110010101000011001000010000 [儲存]

一共進行64輪運算:

先說明運算子:

=賦值運算子: i=0意味著把0賦值給i,也就是讓i的值為0

&按位與運算子:1010b & 1100b的值為1000b

or按位或運算子:1010b or 1100b的值為1110b

^按位異或運算子:1010b ^ 1100b的值為0110b

~按位取反運算子:~1010b的值為0101b

《按位迴圈左移運算子:1100b << 3的值為0110b

mod是取模運算子:33 mod 16 的值為1

i==64是判斷i是否和64相等

以上計算由乙個地方需要說明,就是給t賦值計算的時候,不考慮進製,每個數都是由32位二進位制串表示,加的時候若有進製則進製丟失,得到的t也用32位二進位制串表示。

以上數還有兩個沒有提到,k[i]和s[i]:

s[i]取值為以下陣列的第i+1個數

如s[0]==7,s[3]=22...

k[i]取值為以下陣列的第i+1個數

進行完這些運算後,a,b,c,d的值都獲得了更新

a:******xx******xx******xx******xx [儲存]

b:******xx******xx******xx******xx [儲存]

c:******xx******xx******xx******xx [儲存]

d:******xx******xx******xx******xx [儲存]

把這四個數a -> b -> c -> d按照從低記憶體到高記憶體排列起來,共128位,這就是md5演算法的輸出。

hash演算法原理之md5過程

進製數零一 二三四五 六七 十十一十二十三 十四十五十六 十進位制012 3456 78910 111213 二進位制0110 11100 101110 111 十六進製制01 2345 6789 abcd ef10 計算機的儲存單位為位元組,乙個位元組對應8個二進位制位,共可以表示2 8也就是25...

MD5演算法原理

訊息摘要 將任意長度的字元陣列處理成定長的字元陣列,用於確保原字串不被修改,也可以用做密碼確認,如果密碼一致,則md5產生後的值必然一致,否則不相同 public class datautil string src 唐 stringbuffer sb new stringbuffer byte b1...

MD5值演算法原理

md5 原理說明 一 md5 演算法介紹。md5,即 message digest algorithm 5 資訊 摘要演算法 從名字來看就知道它是從md3 md4發展而來的一種加密演算法,其主要通過採集檔案的資訊摘要,以此進行計算並加密。通過md5演算法進行加密,檔案就可以獲得乙個唯一的md5值,這...