![]() |
General Programming »
Algorithms & Recipes »
Algorithms
Intermediate
CSHA1 - A C++ Class Implementation of the SHA-1 Hash AlgorithmBy Dominik ReichlCSHA1 - A C++ class implementation of the SHA-1 hash algorithm |
VC6, VC7Win2K, WinXPVS2008, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
The Secure Hash Algorithm SHA-1 is a cryptographically secure one-way hash algorithm. It was designed by the NIST (National Institute of Standards and Technology), along with the NSA (National Security Agency). SHA-1 is based on the Message Digest MD4 algorithm design principles by Ronald L. Rivest of MIT.
Well, I think I don't have to explain what you can do with cryptographic hash algorithms. For an example of what you can do with such algorithms, see this CodeProject article (CMD5 class).
For more information about SHA-1, see references [1] and [2].
The CSHA1 class is an easy-to-use class for the SHA-1 hash algorithm.
If you want to test whether your implementation of the class is working, try the test vectors in the 'TestVectors' directory in the demo zip file. You can find the correct final hash values in the header file of the CSHA1 class.
Class members of the CSHA1 class:
void Reset();
This member function resets the class. You have to call this method when using CSHA1 more than once. This method is called automatically in the constructor and the destructor of the class so if you only hash one single data stream you don't need to call Reset() manually.
void Update(const unsigned char* pbData, unsigned int uLen);
Use this method to hash in a data stream. Data in const unsigned char* pbData, length of stream has to be submitted in unsigned int uLen. Length in bytes.
bool HashFile(const TCHAR* tszFileName);
This method hashes file contents into the current state. If hashing was successful, the method returns true, otherwise false. If you use this member function, you don't need to make any call to the Update(...) method. After HashFile(...), you should call the Final() method immediately. You have to call Final() before getting the message digest of the file using the methods ReportHash(...) and GetHash(...).
void Final();
When you have hashed in all data to hash, call this method. This will compute the final SHA-1 message digest and it is therefore needed to call this method before ReportHash(...) and GetHash(...).
void ReportHash(TCHAR* tszReport, REPORT_TYPE rtReportType);
After calling the Final method, you can get the message digest using this method. The result is stored as string in tszReport. Valid format types for uReportType are REPORT_HEX, REPORT_DIGIT and REPORT_HEX_SHORT. If you use REPORT_HEX the returned string looks like 5F A9 FB 34..., using REPORT_DIGIT this method returns the message digest in the form 129 67 5 98... . REPORT_HEX_SHORT is the same as REPORT_HEX, just without separating spaces.
void GetHash(unsigned char* pbDest);
If you don't want to get the hash in a pre-formatted string like ReportHash, you can use this method. This method copies the final message digest (call Final before!) to pbDest. pbDest must be able to hold at least 20 bytes (SHA-1 produces a 160-bit / 20-byte hash).
CSHA1 sha1;
sha1.Update(string0, strlen(string0));
sha1.Update(string1, strlen(string1));
sha1.Update(binary2, uSizeOfBufferBinary2);
sha1.Update(binary3, uSizeOfBufferBinary3);
sha1.Final();
sha1.ReportHash(szReport, CSHA1::REPORT_HEX_SHORT);
// or
sha1.GetHash(binaryArray);
I will comment each line of the example above now.
First declare an instance of the CSHA1 class:
CSHA1 sha1;
Now hash in the data like this:
sha1.Update((unsigned char *)szString, strlen(szString));
You can call this method as often as you wish.
When you hashed in all data, call the Final() member function:
sha1.Final();
If you want to get the final message digest as a pre-formatted string, use this:
sha1.ReportHash(szReport, CSHA1::REPORT_HEX_SHORT);
If you want to get the final message digest in "raw form":
sha1.GetHash(binaryArray); // Get the raw message digest bytes
Hashing files is the same process as hashing strings and binary data but instead of using the Update method you use the HashFile member function of the class.
For more comments, see the string/binary data hashing example above.
CSHA1 sha1;
sha1.HashFile("TheFile.cpp"); // Hash in the contents of the file
// 'TheFile.cpp'
sha1.Final();
sha1.ReportHash(szReport, CSHA1::REPORT_HEX); // Get final hash as
// pre-formatted string
// or
sha1.GetHash(binaryArray); // Get the raw message digest bytes to a
// temporary buffer
[1] RFC 3174: US Secure Hash Algorithm 1 (SHA1)
[2] Bruce Schneier, "Applied Cryptography", pages 442-445
HashFile utility method HashFile method that are larger than 2 GB HashFile now returns an error code instead of copying an error message into the output buffer GetHash now returns an error code and validates the input parameter ReportHashStl STL utility method REPORT_HEX_SHORT reporting mode ReportHash writes the final hash to the start of the buffer, i.e. it's not appending it to the string anymore const CSHA1 class anymore ReportHash and HashFile) optional (useful when bytes count, for example in embedded environments) SHA1_WIPE_VARIABLES) ROL32 improvement for the Microsoft compiler (using _rotl) CSHA1 now compiles fine with GCC 33 under MacOS X (thanks to Larry Hastings) CSHA1 class instances at one time string addition using sprintf. Fixed the bug which caused the digest report function not to work properly. CSHA1 is now Borland compatible. BOOL to bool. Fixed some minor bugs in the web page contents That's it! Happy hashing!
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 17 Mar 2009 Editor: Deeksha Shenoy |
Copyright 2002 by Dominik Reichl Everything else Copyright © CodeProject, 1999-2009 Web19 | Advertise on the Code Project |