c++ simple sha256 code example
Example: sha256 cpp
/***************************************************************************
C++ sha256 function
SHA-256 is the most popular hash function in the SHA-2 family at the time of
writing. It provides 128 bits of security for digital signatures and hash-only
applications (SHA-1 provides only 80 bits).
Remember that while MD5 and SHA-1 are both popular hash functions,
MD5 is considered completely broken, SHA-1 is considered weak.
SHA-2 and its variants are to be crowned the new king.
If working on US Government projects, remember that NIST has deprecated
SHA-1 in since 2010, and that SHA-2 is considered approved for for new projects.
You can use SHA-256 for password hashing, just make sure to use a random salt.
Use a new random salt for each password hash to prevent the attacker from being
able to pre-compute a single dictionary for all of you passwords.
When apply multiple rounds, select a good work factor.
For a work factor of 9, apply 2^9 (512) rounds SHA-256 then store the work
factor next to the salt along with the hashed password.
If you choose, you can modify your work factor later,
and because the work factor is stored with the hash,
still verify old password hashes.
******************************************************************************/
#include <iostream>
#include "sha256.h"
using std::string;
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
string input = "grape";
string output1 = sha256(input);
cout << "sha256('"<< input << "'):" << output1 << endl;
return 0;
}
/*****************************************************************************
output:
sha256('grape'):0f78fcc486f5315418fbf095e71c0675ee07d318e5ac4d150050cd8e57966496
******************************************************************************/
/******************************************************************************
sha256.h
#ifndef SHA256_H
#define SHA256_H
#include <string>
class SHA256
{
protected:
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned long long uint64;
const static uint32 sha256_k[];
static const unsigned int SHA224_256_BLOCK_SIZE = (512/8);
public:
void init();
void update(const unsigned char *message, unsigned int len);
void final(unsigned char *digest);
static const unsigned int DIGEST_SIZE = ( 256 / 8);
protected:
void transform(const unsigned char *message, unsigned int block_nb);
unsigned int m_tot_len;
unsigned int m_len;
unsigned char m_block[2*SHA224_256_BLOCK_SIZE];
uint32 m_h[8];
};
std::string sha256(std::string input);
#define SHA2_SHFR(x, n) (x >> n)
#define SHA2_ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n)))
#define SHA2_ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n)))
#define SHA2_CH(x, y, z) ((x & y) ^ (~x & z))
#define SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z))
#define SHA256_F1(x) (SHA2_ROTR(x, 2) ^ SHA2_ROTR(x, 13) ^ SHA2_ROTR(x, 22))
#define SHA256_F2(x) (SHA2_ROTR(x, 6) ^ SHA2_ROTR(x, 11) ^ SHA2_ROTR(x, 25))
#define SHA256_F3(x) (SHA2_ROTR(x, 7) ^ SHA2_ROTR(x, 18) ^ SHA2_SHFR(x, 3))
#define SHA256_F4(x) (SHA2_ROTR(x, 17) ^ SHA2_ROTR(x, 19) ^ SHA2_SHFR(x, 10))
#define SHA2_UNPACK32(x, str) \
{ \
*((str) + 3) = (uint8) ((x) ); \
*((str) + 2) = (uint8) ((x) >> 8); \
*((str) + 1) = (uint8) ((x) >> 16); \
*((str) + 0) = (uint8) ((x) >> 24); \
}
#define SHA2_PACK32(str, x) \
{ \
*(x) = ((uint32) *((str) + 3) ) \
| ((uint32) *((str) + 2) << 8) \
| ((uint32) *((str) + 1) << 16) \
| ((uint32) *((str) + 0) << 24); \
}
#endif
*******************************************************************************/