雜湊加密 MD5原理

2021-09-19 23:26:50 字數 4699 閱讀 6123

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...