Hash雜湊演算法詳細解析(二)

2021-04-07 01:58:46 字數 3002 閱讀 1030

3 md5演算法

md5演算法定義在rfc 1321中,由ron rivest(rsa公司)在2023年提出。然而很多學者已經找出了構造md5衝突的方法。這些人中包括中國山東大學的王教授和hans dobbertin。所以,單純使用md5的資訊認證模式變得不可靠了。但並不是說md5不能夠使用。

md5演算法的計算步驟:

說明:

define.h的內容如下:

//define variable types

typedef unsigned char ui8;

typedef char i8;

typedef unsigned short ui16;

typedef short i16;

typedef unsigned int ui32;

typedef int i32;

typedef unsigned __int64 ui64;

typedef __int64 i64;

md5.h的內容如下:

#ifndef goodzzp_md5_05_10_13_16

#define goodzzp_md5_05_10_13_16

//md5 algorithm ,md5 class

//program by goodzzp

//2005.10.13

#include "define.h"

//f, g, h and i are basic md5 functions.

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

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

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

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

// rotate_left rotates x left n bits.

// x<<<=n;

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

// ff, gg, hh, and ii transformations for rounds 1, 2, 3, and 4.

//rotation is separate from addition to prevent recomputation.

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

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

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

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

// constants for md5transform routine.

#define md5_s11 7

#define md5_s12 12

#define md5_s13 17

#define md5_s14 22

#define md5_s21 5

#define md5_s22 9

#define md5_s23 14

#define md5_s24 20

#define md5_s31 4

#define md5_s32 11

#define md5_s33 16

#define md5_s34 23

#define md5_s41 6

#define md5_s42 10

#define md5_s43 15

#define md5_s44 21

//md5雜湊類

class md5

//md5變換函式

//out:輸出,長度為16,要求事先已經分配了記憶體

//in:輸入

//length:輸入值的長度

void hash(ui8 *out,const ui8 *in,ui32 length)

//最後計算尾數

steptransform((ui8 *)(in + 64 * i),j,length);

//拷貝輸出

memcpy(out,m_state,4*4);

//恢復m_state值

md5();

}//初始化

//這裡就是4個剛開始的值

md5()

private:

//每步的變換函式

//輸入:

//  data:   要處理的資料塊(不大於64位元組)

//  datablocklen: 資料塊的長度

//  datatotallen: 要處理的所有資料塊的總長度

//輸出結果儲存在m_state裡面

void steptransform(ui8 *data,ui32 datablocklen, ui32 datatotallen)

else if(datablocklen>=56)

}else if(datablocklen == 64)

}//把64位元組的原始資料data進行初步轉化到m_data中去

void firsttransform(ui32 *data)

//核心變換

void coretransform()

private:

ui32 m_state[4]; //儲存有md5輸出值

ui32 m_data[16]; //儲存有每步變換時對輸入的初始化轉化值

};#endif

說明:這個函式只有乙個類和乙個輸出函式,直接使用以下方式就能進行計算:

md5 md5;

ui8 dataout[16];

char *s="abc";

md5.hash(dataout,(ui8*)s,strlen(s));

**經過測試。作者歡迎您提出自己的意見和建議,但作者不對本**的安全和正確性付任何責任。

Hash雜湊演算法詳細解析(一)

hash雜湊演算法詳細解析 一 本文詳細描述了hash演算法的通用模式,在這個基礎上對目前作為標準的幾種主要hash演算法進行了一些分析 md5,ripemd系列,sha系列,tiger以及剛加入到標準不久的whirlpool。給出了部分演算法的 1 hash定義 傳統hash函式的定義 乙個has...

Hash雜湊演算法

hash演算法 雜湊演算法將任意長度的二進位制值對映為較短的固定長度的二進位制值,短的二進位制值稱為雜湊值。雜湊值是一段資料唯一且極其緊湊的數值表示形式。如果雜湊一段明文而且哪怕只更改該段落的乙個字母,隨後的雜湊都將產生不同的值。要找到雜湊為同乙個值的兩個不同的輸入,在計算上是不可能的,所以資料的雜...

hash演算法(雜湊)

hash 演算法 什麼hash 演算法 簡單地來講就是將字串轉化為乙個整數。它一般應用於字串的場景中。現在我們來講hash演算法。hash 公式 hash i hash i 1 base str i a 1 mod base的值是隨機的,意思就是你自己可以去選擇任意的數,但是按照經驗值表明,一般ba...