Hash(雜湊)演算法及MD5的C語言實現

2021-09-24 02:57:33 字數 3612 閱讀 2729

什麼是雜湊演算法?

雜湊演算法又叫雜湊演算法,是將任意長度的二進位制值對映為較短的固定長度的二進位制值,這個小的二進位制值稱為雜湊值。它的原理其實很簡單,就是把一段交易資訊轉換成乙個固定長度的字串。

這串字串具有一些特點:

1. 資訊相同,字串也相同。

2. 資訊相似不會影響字串相同。

3. 可以生成無數的資訊,但是字串的種類是一定的,所以是不可逆的。

可是在訓練集上,通過雜湊演算法,可以得到一系列雜湊函式,通過這些函式,可以將每一張轉化成一串0~1的編碼。

比較神奇的是,編碼串相似的對應的語義也是相似的。

這就是簡單的雜湊演算法在生活中的簡單應用。

雜湊演算法有什麼用途?

雜湊演算法可以檢驗資訊是否是相同的,這樣的優勢可以節省重複檔案傳送的時間。

舉乙個生活中很平常的例子,我們在生活工作中會使用一些軟體給別人傳送檔案資料,如果有人傳送了乙份檔案給乙個人,然後又有乙個人傳送了相同的檔案給了另外乙個人,那麼這個社交軟體在第二次傳送檔案的時候會對比兩次傳送的雜湊值,發現是相同的,該軟體就不會再次上傳檔案給伺服器了。

除此之外,雜湊演算法還可以檢驗資訊的擁有者是否真實。

比如,我們在乙個**註冊乙個賬號,如果**把密碼儲存起來,那這個**不論有多安全,也會有被盜取的風險。但是如果用儲存密碼的雜湊值代替儲存密碼,就沒有這個風險了,因為雜湊值加密過程是不不可逆的。

雜湊演算法會不會被破解?

從理論上說,雜湊值是可以被獲得的,但是對應的使用者密碼很難獲得。

假設乙個**被攻破,黑客獲得了雜湊值,但僅僅只有雜湊值還不能登入**,他還必須算出相應的賬號密碼。

計算密碼的工作量是非常龐大且繁瑣的,嚴格來講,密碼是有可能被破譯的,但破譯成本太大,被成功破譯的機率很小,所以基本是不用擔心密碼洩露的。

當然,黑客們還可以採用一種物理方法,那就是猜密碼。他可以隨機乙個乙個的試密碼,如果猜的密碼算出的雜湊值正好與真正的密碼雜湊值相同,那麼就說明這個密碼猜對了。

密碼的長度越長,密碼越複雜,就越難以猜正確。如果有一種方法能夠提高猜中密碼的可能,那麼可以算是雜湊演算法被破解了。

比如說,例如原本猜中的概率是1/10000000000000,現在增加到了1/1000。如果每猜乙個密碼需要1秒,按照之前的概率猜,直到地球毀滅都可能沒猜中,但後者只需要1小時就足夠了。在這樣的情況下,雜湊演算法就算是被破解啦。

好啦,看到這裡你是不是對雜湊演算法有了初步的了解?大家也不要過於擔心你的賬戶以及資產被黑的風險,因為雜湊演算法僅僅只是位元幣的原理演算法,還有其他演算法一同作用於位元幣的執行,因此就算破解了雜湊演算法也並不能盜取你的賬戶資訊。

c實現md5演算法如下:

#include

#include

#include

#include

typedef unsigned char *pointer;

typedef unsigned short int uint2;

typedef unsigned long int uint4;

typedef struct

md5_ctx;

void md5init(md5_ctx *);

void md5update(md5_ctx *, unsigned char *, unsigned int);

void md5final(unsigned char [16], md5_ctx *);

#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

static unsigned char padding[64] = ;

#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)

inline void encode(unsigned char *output, uint4 *input, unsigned int len)

}inline void decode(uint4 *output, unsigned char *input, unsigned int len)

inline void md5transform (uint4 state[4], unsigned char block[64])

inline void md5init(md5_ctx *context)

inline void md5update(md5_ctx *context, unsigned char *input, unsigned int inputlen)

else

i = 0;

memcpy((pointer)&context->buffer[index], (pointer)&input[i], inputlen-i);

}inline void md5final(unsigned char digest[16], md5_ctx *context)

void md5digest(char *pszinput, unsigned long ninputsize, char *pszoutput)

#define max_size (1024*1024)

int main()

fseek(fp, 0, seek_end);

int size = ftell(fp);

fseek(fp, 0, seek_set);

memset(encrypt, 0, sizeof(encrypt));

int len = fread(encrypt, sizeof(char), size, fp);

printf("size:%d,len:%d\n", size, len);

printf("\nencrytion:");

md5digest(encrypt, size,szdigest);

int i;

for (i=0;i<16;i++)

printf ("%02x",(unsigned char)szdigest[i]);

//getchar();

return 0;

}

雜湊函式 MD5演算法

md5 通過4輪運算 每輪16步,共64步 將任意長的訊息壓縮成為乙個128bit的訊息摘要,使用了4個32bit的暫存器。md結構是基於迭代式結構來構造碰撞穩固的hash函式的方法,即通過某一碰撞穩固的壓縮函式 從較大的固定長度的輸入集合對映到相對小的有固定長度的輸出集合的函式 0,1?0,1?0...

MD5雜湊演算法的示例

在很多地方,都用到了資料加密,比較多的就是md5了,也比較安全,下面就貼上個示例,輸入一串字串,通過md5加密 加密演算法如下 public static string md5 encrypt string md5 str system.security.cryptography.md5 md5 s...

C 使用MD5等雜湊演算法

在對密碼等敏感資訊進行網路傳輸和儲存時,往往不直接儲存其原本值,而是在伺服器端資料庫儲存其雜湊值,比較常用的有如md5,sha1等等。而客戶端則需要將用於輸入的明文密碼轉換為md5 或其他雜湊演算法 雜湊值後再傳輸給伺服器。客戶端對md5加密的程式如下 1.首先引用命名空間system.securi...