第一步:增加填充
增加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...