1. Brief description
OpenSSL offers a wealth of cryptographic tools, some commonly used hashing algorithms
For example, Md5,sha can be used directly with the provided md5.h, sha.h interface;
For the convenience of developers, OpenSSL also provides an evp, evp.h the file with a variety of common tools;
Man EVP can be informed that EVP is a higher-level cryptographic tool provided by openssl,
Can be understood as an encapsulation of the various interfaces provided
EVP files contain many more, this time mainly explains the hashing algorithm provided by EVP
2. Example SHA512 code
To import evp.h using
//initialization
EVP_MD_CTX * evpCtx = EVP_MD_CTX_new ();
EVP_DigestInit_ex (evpCtx, EVP_sha512 (), NULL);
char * data = (char *) "hello";
unsigned int len = strlen (data);
// hash calculation
EVP_DigestUpdate (evpCtx, data, len);
unsigned char result [SHA512_DIGEST_LENGTH] = {0};
// Return result
EVP_DigestFinal_ex (evpCtx, result, & len);
hex_print ("sha512", result, SHA512_DIGEST_LENGTH);
// Use a function directly
unsigned char resultT [SHA512_DIGEST_LENGTH] = {0};
EVP_Digest ("hello", 5, resultT, NULL, EVP_sha512 (), NULL);
hex_print ("sha512", resultT, SHA512_DIGEST_LENGTH);
The above test EVP provides two ways to perform sha512
3. According to the internal Evp.h provided:
The above is used evp_512 (); then the others are:
const EVP_MD *EVP_md2(void);
const EVP_MD *EVP_md4(void);
const EVP_MD *EVP_md5(void);
const EVP_MD *EVP_md5_sha1(void);
const EVP_MD *EVP_blake2b512(void);
const EVP_MD *EVP_blake2s256(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);
The calculated length of the defined hash algorithm
# define SHA224_DIGEST_LENGTH 28
# define SHA256_DIGEST_LENGTH 32
# define SHA384_DIGEST_LENGTH 48
# define SHA512_DIGEST_LENGTH 64
4. Other interfaces provided by OpenSSL can also be used directly if not provided by EVP
md5.h, sha.h
As in Sha.h about the interface provided by sha512
int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA384(const unsigned char *d, size_t n, unsigned char *md);
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);
There are two different ways to call It: the following example
//initialization
SHA512_CTX ctx;
SHA512_Init (& ctx);
char * data = (char *) "hello";
unsigned int len = strlen (data);
unsigned char result [SHA512_DIGEST_LENGTH] = {0};
// Calculate the hash
SHA512_Update (& ctx, data, len);
// take the result
SHA512_Final (result, & ctx);
hex_print ("sha512", result, SHA512_DIGEST_LENGTH);
// a function call
unsigned char resultT [SHA512_DIGEST_LENGTH] = {0};
SHA512 ("hello", 5, resultT);
hex_print ("sha512", resultT, SHA512_DIGEST_LENGTH);
5. Finally attached, the Hex_print code in the above example
static void hex_print(const char *name, const unsigned char *buf, size_t len)
{
size_t i;
fprintf(stderr, "%s ", name);
for (i = 0; i < len; i++)
fprintf(stderr, "%02X", buf[i]);
fputs("\n", stderr);
}
Reference:
OpenSSL 1.1.0c Source code
OpenSSL EVP hashing algorithm (md5,sha1,sha256)