經常到csdn來是查資料,每次都會有所收穫。總是看別人的感覺很不好意思,於是決定自己也寫一點東西貢獻出來。於是就有了這篇md5七分注釋。希望對用到的朋友有所幫助。
記得當初自己剛開始學習md5的時候,從網上搜了很多關於演算法的原理和文本性的描述的東西,但是看了很久一直沒有搞懂,搜c的源**又很少。直到後來學習rsa演算法的時候,從網上下了2023年的歐洲的什麼組織寫的關於rsa、des、md5演算法的c源**(各部分**混在一塊的,比如rsa用到的隨機大素數就是用機器的隨機時間的md5雜湊值獲得的)。我才徹底把md5弄明白了。這裡的**就是我從那裡面分離出來的,**的效率和可重用性都是很高的。整理了一下希望對需要的朋友能夠有幫助。
md5的介紹的文章網上很多,關於md5的來歷,用途什麼的這裡就不再介紹了。這裡主要介紹**。**明白了就什麼都明白了。
/* md5.h */
#ifndef _md5_h_
#define _md5_h_
#define r_memset(x, y, z) memset(x, y, z)
#define r_memcpy(x, y, z) memcpy(x, y, z)
#define r_memcmp(x, y, z) memcmp(x, y, z)
typedef unsigned long uint4;
typedef unsigned char *pointer;
/* md5 context. */
typedef struct md5_ctx;
void md5init(md5_ctx *);
void md5update(md5_ctx *, unsigned char *, unsigned int);
void md5final(unsigned char [16], md5_ctx *);
#endif/* _md5_h_ */
///
/* md5.cpp */
#include "stdafx.h"
/* constants for md5transform routine. */
/*md5轉換用到的常量,演算法本身規定的*/
#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 void md5transform(uint4 [4], unsigned char [64]);
static void encode(unsigned char *, uint4 *, unsigned int);
static void decode(uint4 *, unsigned char *, unsigned int); /*
用於bits填充的緩衝區,為什麼要64個位元組呢?因為當欲加密的資訊的bits數被512除其餘數為448時,
需要填充的bits的最大值為512=64*8 。
*/static unsigned char padding[64] = ; /*
接下來的這幾個巨集定義是md5演算法規定的,就是對資訊進行md5加密都要做的運算。
據說有經驗的高手跟蹤程式時根據這幾個特殊的操作就可以斷定是不是用的md5
*//* f, g, h and i are basic md5 functions.
*/#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)))
/* rotate_left rotates x left n bits.
*/#define 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 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)
/* md5 initialization. begins an md5 operation, writing a new context. */
/*初始化md5的結構*/
void md5init (md5_ctx *context)
/* md5 block update operation. continues an md5 message-digest
operation, processing another message block, and updating the
context. */
/*將與加密的資訊傳遞給md5結構,可以多次呼叫
context:初始化過了的md5結構
input:欲加密的資訊,可以任意長
inputlen:指定input的長度
*/void md5update(md5_ctx *context,unsigned char * input,unsigned int inputlen)
else
i = 0;
/* buffer remaining input */
/*將輸入緩衝區中的不足填充滿512bits的剩餘內容填充到context->buffer中,留待以後再作處理*/
r_memcpy((pointer)&context->buffer[index], (pointer)&input[i], inputlen-i);}
/* md5 finalization. ends an md5 message-digest operation, writing the
the message digest and zeroizing the context. */
/*獲取加密 的最終結果
digest:儲存最終的加密串
context:你前面初始化並填入了資訊的md5結構
*/void md5final (unsigned char digest[16],md5_ctx *context)
/* md5 basic transformation. transforms state based on block. */
/*對512bits資訊(即block緩衝區)進行一次處理,每次處理包括四輪
state[4]:md5結構中的state[4],用於儲存對512bits資訊加密的中間結果或者最終結果
block[64]:欲加密的512bits資訊
*/static void md5transform (uint4 state[4], unsigned char block[64])
/* encodes input (uint4) into output (unsigned char). assumes len is
a multiple of 4. */
/*將4位元組的整數copy到字元形式的緩衝區中
output:用於輸出的字元緩衝區
input:欲轉換的四位元組的整數形式的陣列
len:output緩衝區的長度,要求是4的整數倍
*/static void encode(unsigned char *output, uint4 *input,unsigned int len)}
/* decodes input (unsigned char) into output (uint4). assumes len is
a multiple of 4. */
/*與上面的函式正好相反,這乙個把字元形式的緩衝區中的資料copy到4位元組的整數中(即以整數形式儲存)
output:儲存轉換出的整數
input:欲轉換的字元緩衝區
len:輸入的字元緩衝區的長度,要求是4的整數倍
*/static void decode(uint4 *output, unsigned char *input,unsigned int len)
#include "stdafx.h"
#include "string.h"
int main(int argc, char* argv)
/* 以上**在vc6下編譯通過,執行正常,能夠得到正確的md5值 */
執行螢幕截圖
md5加密演算法
md5.h ifndef md5h define md5h include include void rol unsigned int s,unsigned short cx 32位數迴圈左移實現函式 void ltob unsigned int i b l互轉,接受uint型別 unsigned ...
MD5加密演算法
md5訊息摘要演算法 message digest algorithm 它對輸入的任意長度的訊息進行運算,產生乙個128位的訊息摘要。演算法原理 資料填充 填充訊息使其長度與448模512同餘 長度 448 mod 512 即時訊息長度本身已經滿足了上述長度要求也需要填充。填充方法 附乙個1在訊息後...
加密演算法 MD5
一 簡介 md5的全稱是message digest algorithm 5 資訊摘要演算法 在90年代初由mit laboratory for computer science和rsa data security inc的ronald l.rivest開發出來,經md2 md3和md4發展而來。訊...