md5是一種雜湊演算法,它輸入任意長度的原文,通過乙個雜湊演算法,會得到固定長度128位(16位元組)的雜湊值。由於修改原文一點資料,獲得的雜湊值完全不同,常常用在放置資料篡改,數字簽名,以及如linux登入密碼儲存的安全認證中
typedef
struct
md5_cont;
md5 以512位(64位元組)分組來處理資料,將64位元組資料送到控制器緩衝區中
while
(length-
64>=0)
#define s11 7
#define s12 12
#define s13 17
#define s14 22
#define s21 5
#define s22 9
#define s23 14
#define s24 20
#define s31 4
#define s32 11
#define s33 16
#define s34 23
#define s41 6
#define s42 10
#define s43 15
#define s44 21
#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)
block_trans()進行每個分組演算法運算,通過迴圈函式運算,得到新的a,b,c,d。a,b,c,d的初始值是4個標準的幻數0x01234567,0x89abcdef…使用時如下賦值,因為記憶體儲存時候是低位存低位.
ff(a, b, c, d, x[0], s11, 0xd76aa478),a,b,c,d是待輸出的128位資料,x[0]表示該分組的第乙個子分組(分組分為16子分組參與運算),s11代表移位的位數,0xd76aa478,w為乙個自然數,每次運算都不相同。
con->relute[0]
=0x67452301
; con->relute[1]
=0xefcdab89
; con->relute[2]
=0x98badcfe
; con->relute[3]
=0x10325476
;
void
block_trans
(md5_cont *con)
step 2一直迴圈,直到資料長度小於64位元組,也就是最後乙個分組。最後乙個分組則進行填充
將分組的任意長度資料填充到448位(56位元組)。(如果剛好56位元組,則填充一輪,64個位元組)
填充的結構:第乙個為0x80後面填充0。
void
block_padding
(md5_cont *con,
long len)
//剩餘的長度
;int pad[64]
=;pad_len =
(len <56)
?(56- len):(
120- len);if
(len >=56)
//填充後不為最後乙個分組
else
//填充後為最後乙個分組
memcpy
(con->block+len,pad,pad_len)
;//補全到448位,56位元組
encode
(tran_len,
&con->length,8)
;}
在經過step3 後最後乙個分組為56位元組,還需要填充8位元組的資料長度,構成64位元組,最後輸出4個運算後的128位雜湊值。
memcpy
(con->block+
56,tran_len,8)
;//補全556位
block_trans
(&con)
;
#pragma once
#include
#include
#include
#include
#define s11 7
#define s12 12
#define s13 17
#define s14 22
#define s21 5
#define s22 9
#define s23 14
#define s24 20
#define s31 4
#define s32 11
#define s33 16
#define s34 23
#define s41 6
#define s42 10
#define s43 15
#define s44 21
#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)
typedef
struct
md5_cont;
in***5_init
(md5_cont *);
in***5_en
(char*,
int,
char*)
;int
md5_en_file
(char*)
;
#include
"test.h"
void
encode
(unsigned
char
*output,
unsigned
int*input,
unsigned
int len)
}//將512位的分組轉換為16個子分組
void
decode
(unsigned
int*output,
unsigned
char
*input,
unsigned
int len)
}void
block_trans
(md5_cont *con)
void
block_padding
(md5_cont *con,
long len)
//剩餘的長度
;int pad[64]
=;pad_len =
(len <56)
?(56- len):(
120- len);if
(len >=56)
else
memcpy
(con->block+len,pad,pad_len)
;//補全到448位,56位元組
encode
(tran_len,
&con->length,8)
;memcpy
(con->block+
56,tran_len,8)
;//補全556位
block_trans
(&con);}
in***5_init
(md5_cont *con,
long len)
in***5_en
(char
*data,
int length,
char
*tr_data)
memcpy
(md5_con.block, data +
(i<<6)
, length)
;//將需要補全的資料拷貝
block_padding
(&md5_con,length)
;encode
(tr_data, md5_con.relute,16)
;}
MD5加密原理
簡單字串md5加密1.messagedigest.getinstance md5 digest 需要加密的字元 getbytes 計算出來的結果返回的byte長度始終為16位。2.要記住我們計算出來的md5 32位 最後都都是固定長度32的字串 byte有8位,假如全部都是 11111111 那麼對...
MD5加密和雜湊演算法
md5加密演算法為現在應用最廣泛的雜湊演算法之一,該演算法廣泛應用於網際網路 的使用者檔案加密,能夠將使用者密碼加密為128位的長整數。資料庫並不明文儲存使用者密碼,而是在使用者登入時將輸入密碼字串進行md5加密,與資料庫中所儲存的md5值匹配,從而降低密碼資料庫被盜取後使用者損失的風險。md5加密...
pythonmd5加密原理 MD5加密原理
md5 加密c zz 1.來歷 md5的全稱是 message digest algorithm 5 資訊摘要演算法,在 年代初由 mit laboratory for computer science 和rsa data security inc 的ronald l.rivest 開發出來,經md...