MD5的演算法 C

2022-02-07 04:12:15 字數 4058 閱讀 1440

第一步:增加填充

增加padding使得資料長度(bit為單位)模512為448。如果資料長度正好是模512為448,增加512個填充bit,也就是說填充的個數為1-512。第乙個bit為1,其餘全部為0。

第二步:補足長度

將資料長度轉換為64bit的數值,如果長度超過64bit所能表示的資料長度的範圍,值保留最後64bit,增加到前面填充的資料後面,使得最後的資料為512bit的整數倍。也就是32bit的16倍的整數倍。在rfc1321中,32bit稱為乙個word。

第三步:初始化變數:

用到4個變數,分別為a、b、c、d,均為32bit長。初始化為:

a: 01 23 45 67

b: 89 ab cd ef

c: fe dc ba 98

d: 76 54 32 10

第四步:資料處理:

首先定義4個輔助函式:

f(x,y,z) = xy v not(x) z

g(x,y,z) = xz v y not(z)

h(x,y,z) = x xor y xor z

i(x,y,z) = y xor (x v not(z))

其中:xy表示按位與,x v y表示按位或,not(x)表示按位取反。xor表示按位異或。

函式中的x、y、z均為32bit。

定義乙個需要用到的陣列:t(i),i取值1-64,t(i)等於abs(sin(i))的4294967296倍的整數部分,i為弧度。

假設前三步處理後的資料長度為32*16*nbit

第五步:輸出:

最後得到的abcd為輸出結果,共128bit。a為低位,d為高位。

md5演算法在程式設計中的實現:

下面來看看如何在c,delphi和vb中實現md5演算法

c語言舉例:

--------------------------------------------

*/#ifndef prototypes

#define prototypes 0

#endif

typedef unsigned char *pointer;

typedef unsigned short int uint2;

typedef unsigned long int uint4;

#if prototypes

#define proto_list(list) list

#else

#define proto_list(list) ()

#endif

---------- md5.h----------------------------

typedef struct md5_ctx;

void md5init proto_list ((md5_ctx *));

void md5update proto_list

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

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

※※※※※※※※※md5c.c※※※※※※※※※※※※※※※※※※※※※※※※

#include "global.h"

#include "md5.h"

#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 proto_list ((uint4 [4], unsigned char [64]));

static void encode proto_list

((unsigned char *, uint4 *, unsigned int));

static void decode proto_list

((uint4 *, unsigned char *, unsigned int));

static void md5_memcpy proto_list ((pointer, pointer, unsigned int));

static void md5_memset proto_list ((pointer, int, unsigned int));

static unsigned char padding[64] = ;

/* 定義f g h i 為四個基數

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

/*開始進行md5計算

void md5init (context)

md5_ctx *context;                             

void md5update (context, input, inputlen)

md5_ctx *context;                               

unsigned char *input;                           

unsigned int inputlen;                  

else

i = 0;

md5_memcpy

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

inputlen-i);

}void md5final (digest, context)

unsigned char digest[16];                 

md5_ctx *context;                              

static void md5transform (state, block)

uint4 state[4];

unsigned char block[64];

static void encode (output, input, len)

unsigned char *output;

uint4 *input;

unsigned int len;

}static void decode (output, input, len)

uint4 *output;

unsigned char *input;

unsigned int len;

static void md5_memcpy (output, input, len)

pointer output;

pointer input;

unsigned int len;

static void md5_memset (output, value, len)

pointer output;

int value;

unsigned int len;

MD5演算法 加密

ps 在開發的某些業務中,涉及到一些明文不太安全的時候會用到加密演算法,常用的一般有md5加密 des aes 等加密方式這裡自己了解了一下md5加密。1 md5演算法加密 也就是 資訊 摘要演算法5 就是把乙個任意長度的位元組串變換成一定長的十六進製制數字串 public static strin...

MD5演算法實現

md5.h ifndef md5 h define md5 h typedef struct md5 ctx 非線性輔助函式 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...

MD5演算法實現

md5.h ifndef md5 h define md5 h typedef struct md5 ctx 非線性輔助函式 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...