📄 zmd5.h
字号:
// [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
// [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
// [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
// [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
//
// /* Round 2. */
// /* Let [abcd k s i] denote the operation
// a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
// /* Do the following 16 operations. */
// [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
// [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
// [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
// [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
//
// /* Round 3. */
// /* Let [abcd k s t] denote the operation
// a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
// /* Do the following 16 operations. */
// [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
// [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
// [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
// [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
//
// /* Round 4. */
// /* Let [abcd k s t] denote the operation
// a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
// /* Do the following 16 operations. */
// [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
// [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
// [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
// [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
//
// /* Then perform the following additions. (That is increment each
// of the four registers by the value it had before this block
// was started.) */
// A = A + AA
// B = B + BB
// C = C + CC
// D = D + DD
//
// end /* of loop on i */
//
// Rivest [Page 5]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// 3.5 Step 5. Output
//
// The message digest produced as output is A, B, C, D. That is, we
// begin with the low-order byte of A, and end with the high-order byte
// of D.
//
// This completes the description of MD5. A reference implementation in
// C is given in the appendix.
//
// 4. Summary
//
// The MD5 message-digest algorithm is simple to implement, and provides
// a "fingerprint" or message digest of a message of arbitrary length.
// It is conjectured that the difficulty of coming up with two messages
// having the same message digest is on the order of 2^64 operations,
// and that the difficulty of coming up with any message having a given
// message digest is on the order of 2^128 operations. The MD5 algorithm
// has been carefully scrutinized for weaknesses. It is, however, a
// relatively new algorithm and further security analysis is of course
// justified, as is the case with any new proposal of this sort.
//
// 5. Differences Between MD4 and MD5
//
// The following are the differences between MD4 and MD5:
//
// 1. A fourth round has been added.
//
// 2. Each step now has a unique additive constant.
//
// 3. The function g in round 2 was changed from (XY v XZ v YZ) to
// (XZ v Y not(Z)) to make g less symmetric.
//
// 4. Each step now adds in the result of the previous step. This
// promotes a faster "avalanche effect".
//
// 5. The order in which input words are accessed in rounds 2 and
// 3 is changed, to make these patterns less like each other.
//
// 6. The shift amounts in each round have been approximately
// optimized, to yield a faster "avalanche effect." The shifts in
// different rounds are distinct.
//
// Rivest [Page 6]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// References
//
// [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
// RSA Data Security, Inc., April 1992.
//
// [2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes
// and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
// Proceedings, pages 303-311, Springer-Verlag, 1991.
//
// [3] CCITT Recommendation X.509 (1988), "The Directory -
// Authentication Framework."
//
// APPENDIX A - Reference Implementation
//
// This appendix contains the following files taken from RSAREF: A
// Cryptographic Toolkit for Privacy-Enhanced Mail:
//
// global.h -- global header file
//
// md5.h -- header file for MD5
//
// md5c.c -- source code for MD5
//
// For more information on RSAREF, send email to <rsaref@rsa.com>.
//
// The appendix also includes the following file:
//
// mddriver.c -- test driver for MD2, MD4 and MD5
//
// The driver compiles for MD5 by default but can compile for MD2 or MD4
// if the symbol MD is defined on the C compiler command line as 2 or 4.
//
// The implementation is portable and should work on many different
// plaforms. However, it is not difficult to optimize the implementation
// on particular platforms, an exercise left to the reader. For example,
// on "little-endian" platforms where the lowest-addressed byte in a 32-
// bit word is the least significant and there are no alignment
// restrictions, the call to Decode in MD5Transform can be replaced with
// a typecast.
//
// A.1 global.h
//
// /* GLOBAL.H - RSAREF types and constants
// */
//
// /* PROTOTYPES should be set to one if and only if the compiler supports
// function argument prototyping.
// The following makes PROTOTYPES default to 0 if it has not already
//
// Rivest [Page 7]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// been defined with C compiler flags.
// */
// #ifndef PROTOTYPES
// #define PROTOTYPES 0
// #endif
//
// /* 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;
//
// /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
// If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
// returns an empty list.
// */
// #if PROTOTYPES
// #define PROTO_LIST(list) list
// #else
// #define PROTO_LIST(list) ()
// #endif
//
// A.2 md5.h
//
// /* MD5.H - header file for MD5C.C
// */
//
// /* 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.
//
// Rivest [Page 8]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// These notices must be retained in any copies of any part of this
// documentation and/or software.
// */
//
// /* 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 PROTO_LIST ((MD5_CTX *));
// void MD5Update PROTO_LIST
// ((MD5_CTX *, unsigned char *, unsigned int));
// void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
//
// A.3 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 "global.h"
// #include "md5.h"
//
// /* Constants for MD5Transform routine.
// */
//
// Rivest [Page 9]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// #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] = {
// 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)); \
//
//
// Rivest [Page 10]
//
// RFC 1321 MD5 Message-Digest Algorithm April 1992
//
//
// (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 (context)
// 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -