最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言 MD5的源碼實(shí)例詳解

 更新時(shí)間:2017年01月16日 09:38:57   投稿:lqh  
這篇文章主要介紹了C語言 MD5的源碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

C語言 MD5源碼

md5c.h:

/* POINTER defines a generic pointer type */ 
typedef unsigned char * POINTER; 
 
/* UINT2 defines a two byte word */ 
//typedef unsigned short int UINT2; 
 
/* UINT4 defines a four byte word */ 
typedef unsigned long int UINT4; 
 
 
/* MD5 context. */ 
typedef struct { 
 UINT4 state[4];         /* state (ABCD) */ 
 UINT4 count[2];  /* number of bits, modulo 2^64 (lsb first) */ 
 unsigned char buffer[64];       /* input buffer */ 
} MD5_CTX; 
 
void MD5Init (MD5_CTX *context); 
void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen); 
void MD5UpdaterString(MD5_CTX *context,const char *string); 
int MD5FileUpdateFile (MD5_CTX *context,char *filename); 
void MD5Final (unsigned char digest[16], MD5_CTX *context); 
void MDString (char *string,unsigned char digest[16]); 
int MD5File (char *filename,unsigned char digest[16]); 

md5c.c:

/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm 
 */ 
 
/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All 
rights reserved. 
 
License to copy and use this software is granted provided that it 
is identified as the "RSA Data Security, Inc. MD5 Message-Digest 
Algorithm" in all material mentioning or referencing this software 
or this function. 
 
License is also granted to make and use derivative works provided 
that such works are identified as "derived from the RSA Data 
Security, Inc. MD5 Message-Digest Algorithm" in all material 
mentioning or referencing the derived work. 
 
RSA Data Security, Inc. makes no representations concerning either 
the merchantability of this software or the suitability of this 
software for any particular purpose. It is provided "as is" 
without express or implied warranty of any kind. 
 
These notices must be retained in any copies of any part of this 
documentation and/or software. 
 */ 
#include "md5c.h" 
#include <string.h> 
#include <stdio.h> 
 
/* Constants for MD5Transform routine. 
*/ 
 
 
#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 MD5_memcpy (POINTER output, POINTER input, unsigned int len); 
static void MD5Transform (UINT4 state[4], unsigned char block[64]); 
static void Encode (unsigned char *output, UINT4 *input, unsigned int len); 
static void MD5_memset (POINTER output, int value, unsigned int len); 
static void Decode (UINT4 *output, unsigned char *input, unsigned int len); 
 
static unsigned char PADDING[64] = { 
 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
}; 
 
/* 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) { \ 
 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
 } 
#define GG(a, b, c, d, x, s, ac) { \ 
 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
 } 
#define HH(a, b, c, d, x, s, ac) { \ 
 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
 } 
#define II(a, b, c, d, x, s, ac) { \ 
 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ 
 (a) = ROTATE_LEFT ((a), (s)); \ 
 (a) += (b); \ 
 } 
 
/* MD5 initialization. Begins an MD5 operation, writing a new context. 
 */ 
void MD5Init (MD5_CTX *context)          /* context */ 
{ 
 context->count[0] = context->count[1] = 0; 
 /* Load magic initialization constants. 
 */ 
 context->state[0] = 0x67452301; 
 context->state[1] = 0xefcdab89; 
 context->state[2] = 0x98badcfe; 
 context->state[3] = 0x10325476; 
} 
 
/* MD5 block update operation. Continues an MD5 message-digest 
 operation, processing another message block, and updating the 
 context. 
 */ 
void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen) 
 
{ 
 unsigned int i, index, partLen; 
 
 /* Compute number of bytes mod 64 */ 
 index = (unsigned int)((context->count[0] >> 3) & 0x3F); 
 
 /* Update number of bits */ 
 if ((context->count[0] += ((UINT4)inputLen << 3)) 
  < ((UINT4)inputLen << 3)) 
  context->count[1]++; 
 context->count[1] += ((UINT4)inputLen >> 29); 
 
 partLen = 64 - index; 
 
 /* Transform as many times as possible. 
 */ 
 if (inputLen >= partLen) { 
  MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); 
  MD5Transform (context->state, context->buffer); 
 
  for (i = partLen; i + 63 < inputLen; i += 64) 
   MD5Transform (context->state, &input[i]); 
 
  index = 0; 
 } 
 else 
  i = 0; 
 
 /* Buffer remaining input */ 
 MD5_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. 
 */ 
void MD5Final (unsigned char digest[16], MD5_CTX *context)         
{ 
 unsigned char bits[8]; 
 unsigned int index, padLen; 
 
 /* Save number of bits */ 
 Encode (bits, context->count, 8); 
 
 /* Pad out to 56 mod 64. 
 */ 
 index = (unsigned int)((context->count[0] >> 3) & 0x3f); 
 padLen = (index < 56) ? (56 - index) : (120 - index); 
 MD5Update (context, PADDING, padLen); 
 
 /* Append length (before padding) */ 
 MD5Update (context, bits, 8); 
 
 /* Store state in digest */ 
 Encode (digest, context->state, 16); 
 
 /* Zeroize sensitive information. 
 */ 
 MD5_memset ((POINTER)context, 0, sizeof (*context)); 
} 
 
/* MD5 basic transformation. Transforms state based on block. 
 */ 
static void MD5Transform (UINT4 state[4], unsigned char block[64]) 
{ 
 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; 
 
 Decode (x, block, 64); 
 
 /* Round 1 */ 
 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ 
 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ 
 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ 
 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ 
 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ 
 FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ 
 FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ 
 FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ 
 FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ 
 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ 
 FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ 
 FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ 
 FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ 
 FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ 
 FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ 
 FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ 
 
 /* Round 2 */ 
 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ 
 GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ 
 GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ 
 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ 
 GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ 
 GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ 
 GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ 
 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ 
 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ 
 GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ 
 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ 
 GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ 
 GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ 
 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ 
 GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ 
 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ 
 
 /* Round 3 */ 
 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ 
 HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ 
 HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ 
 HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ 
 HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ 
 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ 
 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ 
 HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ 
 HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ 
 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ 
 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ 
 HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ 
 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ 
 HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ 
 HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ 
 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ 
 
 /* Round 4 */ 
 II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ 
 II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ 
 II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ 
 II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ 
 II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ 
 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ 
 II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ 
 II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ 
 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ 
 II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ 
 II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ 
 II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ 
 II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ 
 II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ 
 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ 
 II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ 
 
 state[0] += a; 
 state[1] += b; 
 state[2] += c; 
 state[3] += d; 
 
 /* Zeroize sensitive information. 
 */ 
 MD5_memset ((POINTER)x, 0, sizeof (x)); 
} 
 
/* Encodes input (UINT4) into output (unsigned char). Assumes len is 
 a multiple of 4. 
 */ 
static void Encode (unsigned char *output, UINT4 *input, unsigned int len) 
{ 
 unsigned int i, j; 
 
 for (i = 0, j = 0; j < len; i++, j += 4) { 
  output[j] = (unsigned char)(input[i] & 0xff); 
  output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); 
  output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); 
  output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); 
 } 
} 
 
/* Decodes input (unsigned char) into output (UINT4). Assumes len is 
 a multiple of 4. 
 */ 
static void Decode (UINT4 *output, unsigned char *input, unsigned int len) 
{ 
 unsigned int i, j; 
 
 for (i = 0, j = 0; j < len; i++, j += 4) 
  output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) | 
  (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); 
} 
 
/* Note: Replace "for loop" with standard memcpy if possible. 
 */ 
 
static void MD5_memcpy (POINTER output, POINTER input, unsigned int len) 
{ 
 unsigned int i; 
 
 for (i = 0; i < len; i++) 
  output[i] = input[i]; 
} 
 
/* Note: Replace "for loop" with standard memset if possible. 
 */ 
static void MD5_memset (POINTER output, int value, unsigned int len) 
{ 
 unsigned int i; 
 
 for (i = 0; i < len; i++) 
  ((char *)output)[i] = (char)value; 
} 
/* Digests a string and prints the result. 
 */ 
void MDString (char *string,unsigned char digest[16]) 
{ 
 MD5_CTX context; 
 unsigned int len = strlen (string); 
 
 MD5Init (&context); 
 MD5Update (&context, (unsigned char *)string, len); 
 MD5Final (digest, &context); 
} 
/* Digests a file and prints the result. 
 */ 
int MD5File (char *filename,unsigned char digest[16]) 
{ 
 FILE *file; 
 MD5_CTX context; 
 int len; 
 unsigned char buffer[1024]; 
 
 if ((file = fopen (filename, "rb")) == NULL) 
  return -1; 
 else { 
  MD5Init (&context); 
  while (len = fread (buffer, 1, 1024, file)) 
   MD5Update (&context, buffer, len); 
  MD5Final (digest, &context); 
 
  fclose (file); 
 } 
 return 0; 
} 
void MD5UpdaterString(MD5_CTX *context,const char *string) 
{ 
 unsigned int len = strlen (string); 
 MD5Update (context, (unsigned char *)string, len); 
} 
int MD5FileUpdateFile (MD5_CTX *context,char *filename) 
{ 
 FILE *file; 
 int len; 
 unsigned char buffer[1024]; 
 
 if ((file = fopen (filename, "rb")) == NULL) 
  return -1; 
 else { 
  while (len = fread (buffer, 1, 1024, file)) 
   MD5Update (context, buffer, len); 
  fclose (file); 
 } 
 return 0; 
} 

用法:

void main(void) 
{ 
  unsigned char digest[16]; //存放結(jié)果 
 
  //第一種用法: 
 
  MD5_CTX md5c; 
  MD5Init(&md5c); //初始化 
  MD5UpdaterString(&md5c,"你要測試的字符串"); 
  MD5FileUpdateFile(&md5c,"你要測試的文件路徑"); 
  MD5Final(digest,&md5c); 
 
  //第二種用法: 
  MDString("你要測試的字符串",digest); //直接輸入字符串并得出結(jié)果 
 
 //第三種用法: 
 MD5File("你要測試的文件路徑",digest); //直接輸入文件路徑并得出結(jié)果 
} 

相關(guān)文章:

C++ MD5源碼:http://m.fzitv.net/article/103113.htm

C語言 MD5源碼:http://m.fzitv.net/article/103108.htm

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 從頭學(xué)習(xí)C語言之if語句的使用

    從頭學(xué)習(xí)C語言之if語句的使用

    這篇文章主要為大家詳細(xì)介紹了C語言之if語句的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言超全面講解字符串函數(shù)

    C語言超全面講解字符串函數(shù)

    字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長度,字符查找等的函數(shù)
    2022-06-06
  • 一篇文章教你如何用C語言實(shí)現(xiàn)strcpy和strlen

    一篇文章教你如何用C語言實(shí)現(xiàn)strcpy和strlen

    這篇文章主要為大家介紹了C語言實(shí)現(xiàn)strcpy和strlen的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言中 值傳遞和指針傳遞實(shí)例詳解

    C語言中 值傳遞和指針傳遞實(shí)例詳解

    這篇文章主要介紹了C語言中 值傳遞和指針傳遞實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++中友元類和嵌套類使用詳解

    C++中友元類和嵌套類使用詳解

    友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機(jī)制。可以把一個(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元,所謂嵌套類,就是在類中聲明的類。如下代碼中,類Inner就是一個(gè)嵌套類,類Outer是外圍類
    2022-08-08
  • C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C++計(jì)算每個(gè)字符出現(xiàn)的次數(shù)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • C++中Operator類型強(qiáng)制轉(zhuǎn)換成員函數(shù)解析

    C++中Operator類型強(qiáng)制轉(zhuǎn)換成員函數(shù)解析

    轉(zhuǎn)換函數(shù)定義了由<類型說明符1>到<類型說明符2>之間的映射關(guān)系??梢?,轉(zhuǎn)換函數(shù)是用來將一種類型的數(shù)據(jù)轉(zhuǎn)換成為另一種類型
    2013-09-09
  • OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時(shí),opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • C++實(shí)現(xiàn)圖書管理程序

    C++實(shí)現(xiàn)圖書管理程序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書管理程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++基礎(chǔ)語法:普通繼承

    c++基礎(chǔ)語法:普通繼承

    基類成員的private成員不但對于對象是不可見的,對于派生類也是不可見的,只能被基類成員或者友元訪問
    2013-09-09

最新評論

吉安市| 杭锦旗| 北海市| 桃源县| 宁化县| 滕州市| 兴仁县| 泰兴市| 伊吾县| 交城县| 舒兰市| 苍南县| 临邑县| 武穴市| 武平县| 嵊泗县| 黄梅县| 青岛市| 许昌市| 云阳县| 封开县| 西平县| 利辛县| 镇江市| 日土县| 新疆| 岢岚县| 兰坪| 乌拉特后旗| 科技| 九龙县| 涟水县| 白山市| 星座| 东乌珠穆沁旗| 新竹市| 胶州市| 远安县| 凤山县| 启东市| 罗江县|