Files correlati : authoriz.exe Ricompilazione Demo : [ ] Commento : Aggiunto supporto per chiavi MD5 git-svn-id: svn://10.65.10.50/trunk@20001 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			343 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /*****************************************************************************************
 | |
| 
 | |
| ***		MD5Checksum.h: interface for the MD5Checksum class.
 | |
| 
 | |
| ***		Developed by Langfine Ltd. 
 | |
| ***		Released to the public domain 12/Nov/2001.
 | |
| ***		Please visit our website www.langfine.com
 | |
| 
 | |
| ***		Any modifications must be clearly commented to distinguish them from Langfine's 
 | |
| ***		original source code. Please advise Langfine of useful modifications so that we 
 | |
| ***		can make them generally available. 
 | |
| 
 | |
| *****************************************************************************************/
 | |
| 
 | |
| 
 | |
| #ifndef __MD5CHECKSUM_H__
 | |
| #define __MD5CHECKSUM_H__
 | |
| 
 | |
| /****************************************************************************************
 | |
| This software is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm. 
 | |
| Incorporation of this statement is a condition of use; please see the RSA
 | |
| Data Security Inc copyright notice below:-
 | |
| 
 | |
| Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
 | |
| rights reserved.
 | |
| 
 | |
| 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.
 | |
| 
 | |
| 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.
 | |
| *****************************************************************************************/
 | |
| 
 | |
| /****************************************************************************************
 | |
| This implementation of the RSA MD5 Algorithm was written by Langfine Ltd.
 | |
| 
 | |
| Langfine Ltd 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.
 | |
| 
 | |
| In addition to the above, Langfine make no warrant or assurances regarding the 
 | |
| accuracy of this implementation of the MD5 checksum algorithm nor any assurances regarding
 | |
| its suitability for any purposes.
 | |
| 
 | |
| This implementation may be used freely provided that Langfine is credited
 | |
| in a copyright or similar notices (eg, RSA MD5 Algorithm implemented by Langfine
 | |
| Ltd.) and provided that the RSA Data Security notices are complied with.
 | |
| 
 | |
| Langfine may be contacted at mail@langfine.com
 | |
| */
 | |
| 
 | |
| /*****************************************************************************************
 | |
| CLASS:			wxMD5Checksum
 | |
| DESCRIPTION:	Implements the "RSA Data Security, Inc. MD5 Message-Digest Algorithm".
 | |
| NOTES:			Calculates the RSA MD5 checksum for a file or congiguous array of data.	
 | |
| 
 | |
| Below are extracts from a memo on The MD5 Message-Digest Algorithm by R. Rivest of MIT 
 | |
| Laboratory for Computer Science and RSA Data Security, Inc., April 1992. 
 | |
| 
 | |
|    1. Executive Summary
 | |
|    This document describes the MD5 message-digest algorithm. The
 | |
|    algorithm takes as input a message of arbitrary length and produces
 | |
|    as output a 128-bit "fingerprint" or "message digest" of the input.
 | |
|    It is conjectured that it is computationally infeasible to produce
 | |
|    two messages having the same message digest, or to produce any
 | |
|    message having a given prespecified target message digest. The MD5
 | |
|    algorithm is intended for digital signature applications, where a
 | |
|    large file must be "compressed" in a secure manner before being
 | |
|    encrypted with a private (secret) key under a public-key cryptosystem
 | |
|    such as RSA.
 | |
|    
 | |
|    The MD5 algorithm is designed to be quite fast on 32-bit machines. In
 | |
|    addition, the MD5 algorithm does not require any large substitution
 | |
|    tables; the algorithm can be coded quite compactly.
 | |
|    The MD5 algorithm is an extension of the MD4 message-digest algorithm
 | |
|    1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
 | |
|    design. MD5 was designed because it was felt that MD4 was perhaps
 | |
|    being adopted for use more quickly than justified by the existing
 | |
|    critical review; because MD4 was designed to be exceptionally fast,
 | |
|    it is "at the edge" in terms of risking successful cryptanalytic
 | |
|    attack. MD5 backs off a bit, giving up a little in speed for a much
 | |
|    greater likelihood of ultimate security. It incorporates some
 | |
|    suggestions made by various reviewers, and contains additional
 | |
|    optimizations. The MD5 algorithm is being placed in the public domain
 | |
|    for review and possible adoption as a standard.
 | |
| 
 | |
| 
 | |
|    2. Terminology and Notation
 | |
|    In this document a "word" is a 32-bit quantity and a "byte" is an
 | |
|    eight-bit quantity. A sequence of bits can be interpreted in a
 | |
|    natural manner as a sequence of bytes, where each consecutive group
 | |
|    of eight bits is interpreted as a byte with the high-order (most
 | |
|    significant) bit of each byte listed first. Similarly, a sequence of
 | |
|    bytes can be interpreted as a sequence of 32-bit words, where each
 | |
|    consecutive group of four bytes is interpreted as a word with the
 | |
|    low-order (least significant) byte given first.
 | |
|    Let x_i denote "x sub i". If the subscript is an expression, we
 | |
|    surround it in braces, as in x_{i+1}. Similarly, we use ^ for
 | |
|    superscripts (exponentiation), so that x^i denotes x to the i-th   power.
 | |
|    Let the symbol "+" denote addition of words (i.e., modulo-2^32
 | |
|    addition). Let X <<< s denote the 32-bit value obtained by circularly
 | |
|    shifting (rotating) X left by s bit positions. Let not(X) denote the
 | |
|    bit-wise complement of X, and let X v Y denote the bit-wise OR of X
 | |
|    and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
 | |
|    denote the bit-wise AND of X and Y.
 | |
| 
 | |
| 
 | |
|    3. MD5 Algorithm Description
 | |
|    We begin by supposing that we have a b-bit message as input, and that
 | |
|    we wish to find its message digest. Here b is an arbitrary
 | |
|    nonnegative integer; b may be zero, it need not be a multiple of
 | |
|    eight, and it may be arbitrarily large. We imagine the bits of the
 | |
|    message written down as follows:          m_0 m_1 ... m_{b-1}
 | |
|    The following five steps are performed to compute the message digest
 | |
|    of the message.
 | |
|    
 | |
|    3.1 Step 1. Append Padding Bits
 | |
|    The message is "padded" (extended) so that its length (in bits) is
 | |
|    congruent to 448, modulo 512. That is, the message is extended so
 | |
|    that it is just 64 bits shy of being a multiple of 512 bits long.
 | |
|    Padding is always performed, even if the length of the message is
 | |
|    already congruent to 448, modulo 512.
 | |
|    Padding is performed as follows: a single "1" bit is appended to the
 | |
|    message, and then "0" bits are appended so that the length in bits of
 | |
|    the padded message becomes congruent to 448, modulo 512. In all, at
 | |
|    least one bit and at most 512 bits are appended.
 | |
| 
 | |
|    3.2 Step 2. Append Length
 | |
|    A 64-bit representation of b (the length of the message before the
 | |
|    padding bits were added) is appended to the result of the previous
 | |
|    step. In the unlikely event that b is greater than 2^64, then only
 | |
|    the low-order 64 bits of b are used. (These bits are appended as two
 | |
|    32-bit words and appended low-order word first in accordance with the
 | |
|    previous conventions.)
 | |
|    At this point the resulting message (after padding with bits and with
 | |
|    b) has a length that is an exact multiple of 512 bits. Equivalently,
 | |
|    this message has a length that is an exact multiple of 16 (32-bit)
 | |
|    words. Let M[0 ... N-1] denote the words of the resulting message,
 | |
|    where N is a multiple of 16.
 | |
|    
 | |
|    3.3 Step 3. Initialize MD Buffer
 | |
|    A four-word buffer (A,B,C,D) is used to compute the message digest.
 | |
|    Here each of A, B, C, D is a 32-bit register. These registers are
 | |
|    initialized to the following values in hexadecimal, low-order bytes   first):
 | |
|           word A: 01 23 45 67          word B: 89 ab cd ef
 | |
|           word C: fe dc ba 98          word D: 76 54 32 10
 | |
| 
 | |
|    3.4 Step 4. Process Message in 16-Word Blocks
 | |
|    We first define four auxiliary functions that each take as input
 | |
|    three 32-bit words and produce as output one 32-bit word.
 | |
|           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))
 | |
|    In each bit position F acts as a conditional: if X then Y else Z.
 | |
|    The function F could have been defined using + instead of v since XY
 | |
|    and not(X)Z will never have 1's in the same bit position.) It is
 | |
|    interesting to note that if the bits of X, Y, and Z are independent
 | |
|    and unbiased, the each bit of F(X,Y,Z) will be independent and   unbiased.
 | |
|    The functions G, H, and I are similar to the function F, in that they
 | |
|    act in "bitwise parallel" to produce their output from the bits of X,
 | |
|    Y, and Z, in such a manner that if the corresponding bits of X, Y,
 | |
|    and Z are independent and unbiased, then each bit of G(X,Y,Z),
 | |
|    H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
 | |
|    the function H is the bit-wise "xor" or "parity" function of its   inputs.
 | |
|    This step uses a 64-element table T[1 ... 64] constructed from the
 | |
|    sine function. Let T[i] denote the i-th element of the table, which
 | |
|    is equal to the integer part of 4294967296 times abs(sin(i)), where i
 | |
|    is in radians. The elements of the table are given in the appendix.
 | |
|    Do the following:   
 | |
|    
 | |
| 	 //Process each 16-word block.
 | |
|      For i = 0 to N/16-1 do     // Copy block i into X.      
 | |
| 		For j = 0 to 15 do
 | |
| 			Set X[j] to M[i*16+j].     
 | |
|         end //of loop on j
 | |
| 
 | |
| 		 // Save A as AA, B as BB, C as CC, and D as DD.
 | |
| 		 AA = A     BB = B
 | |
| 		 CC = C     DD = D     
 | |
| 
 | |
| 		 // Round 1.
 | |
| 		 // Let [abcd k s i] denote the operation
 | |
| 		 // a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s).
 | |
| 		 // Do the following 16 operations.
 | |
| 		 [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
 | |
| 
 | |
|    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.
 | |
|    
 | |
|    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.
 | |
| 
 | |
|    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
 | |
| 
 | |
| 
 | |
|    The level of security discussed in this memo is considered to be
 | |
|    sufficient for implementing very high security hybrid digital-
 | |
|    signature schemes based on MD5 and a public-key cryptosystem.
 | |
|    Author's Address
 | |
|    Ronald L. Rivest   Massachusetts Institute of Technology
 | |
|    Laboratory for Computer Science   NE43-324   545 Technology Square
 | |
|    Cambridge, MA  02139-1986   Phone: (617) 253-5880
 | |
|    EMail: rivest@theory.lcs.mit.edu
 | |
| 
 | |
| 
 | |
| *****************************************************************************************/
 | |
| 
 | |
| #ifndef _WX_FILEH__
 | |
| class wxFile;
 | |
| #endif
 | |
| 
 | |
| class wxMD5Checksum  
 | |
| {
 | |
| public:
 | |
| 	// interface functions for the RSA MD5 calculation
 | |
| 	static wxString GetMD5(unsigned char* pBuf, unsigned int nLength);
 | |
| 	static wxString GetMD5(wxFile& File);
 | |
| 	static wxString GetMD5(const wxString& strFilePath);
 | |
| 
 | |
| protected:
 | |
| 	// constructor/destructor
 | |
| 	wxMD5Checksum();
 | |
| 	virtual ~wxMD5Checksum() {};
 | |
| 
 | |
| 	// RSA MD5 implementation
 | |
| 	void Transform(unsigned char Block[64]);
 | |
| 	void Update(unsigned char* Input, unsigned long nInputLen);
 | |
| 	wxString Final();
 | |
| 	inline unsigned long RotateLeft(unsigned long x, int n);
 | |
| 	inline void FF( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
 | |
| 	inline void GG( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
 | |
| 	inline void HH( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
 | |
| 	inline void II( unsigned long& A, unsigned long B, unsigned long C, unsigned long D, unsigned long X, unsigned long S, unsigned long T);
 | |
| 
 | |
| 	// utility functions
 | |
| 	inline void DWordToByte(unsigned char* Output, unsigned long* Input, unsigned int nLength);
 | |
| 	inline void ByteToDWord(unsigned long* Output, unsigned char* Input, unsigned int nLength);
 | |
| 
 | |
| private:
 | |
| 	unsigned char m_lpszBuffer[64]; // input buffer
 | |
| 	unsigned long m_nCount[2];			// number of bits, modulo 2^64 (lsb first)
 | |
| 	unsigned long m_lMD5[4];			  // MD5 checksum
 | |
| };
 | |
| 
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |