openssl库中安全哈希算法的使用

SHA

SHA1

SHA224

SHA256

SHA384

SHA512

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <openssl/sha.h>
#include <openssl/crypto.h>

static char *s1 = "abc";
static int s1_len = 3;

char *ret_sha = "0164b8a914cd2a5e74c4f7ff082c4d97f1edf880";
char *ret_sha1 = "a9993e364706816aba3e25717850c26c9cd0d89d";
char *ret_sha224 = "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7";
char *ret_sha256 =
    "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad";
char *ret_sha384 =
    "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7";
char *ret_sha512 =
    "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f";

static char *pt(unsigned char *md, int len)
{
	int i;
	static char buf[256];

	for (i = 0; i < len; i++)
		sprintf(&(buf[i * 2]), "%02x", md[i]);
	return (buf);
}

void sha(void)
{
	SHA_CTX c;
	unsigned char md[SHA_DIGEST_LENGTH];
	char *p;

	SHA((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA_DIGEST_LENGTH);
	printf("SHA	: %s\n", p);

	SHA_Init(&c);
	SHA_Update(&c, s1, s1_len);
	SHA_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA_DIGEST_LENGTH);
	printf("SHA	: %s\n", p);
}

void sha1(void)
{
	SHA_CTX c;
	unsigned char md[SHA_DIGEST_LENGTH];
	char *p;

	SHA1((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA_DIGEST_LENGTH);
	printf("SHA1	: %s\n", p);

	SHA1_Init(&c);
	SHA1_Update(&c, s1, s1_len);
	SHA1_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA_DIGEST_LENGTH);
	printf("SHA1	: %s\n", p);
}

void sha224(void)
{
	SHA256_CTX c;
	unsigned char md[SHA224_DIGEST_LENGTH];
	char *p;

	SHA224((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA224_DIGEST_LENGTH);
	printf("SHA224	: %s\n", p);

	SHA224_Init(&c);
	SHA224_Update(&c, s1, s1_len);
	SHA224_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA224_DIGEST_LENGTH);
	printf("SHA224	: %s\n", p);
}

void sha256(void)
{
	SHA256_CTX c;
	unsigned char md[SHA256_DIGEST_LENGTH];
	char *p;

	SHA256((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA256_DIGEST_LENGTH);
	printf("SHA256	: %s\n", p);

	SHA256_Init(&c);
	SHA256_Update(&c, s1, s1_len);
	SHA256_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA256_DIGEST_LENGTH);
	printf("SHA256	: %s\n", p);
}

void sha384(void)
{
	SHA512_CTX c;
	unsigned char md[SHA384_DIGEST_LENGTH];
	char *p;

	SHA384((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA384_DIGEST_LENGTH);
	printf("SHA384	: %s\n", p);

	SHA384_Init(&c);
	SHA384_Update(&c, s1, s1_len);
	SHA384_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA384_DIGEST_LENGTH);
	printf("SHA384	: %s\n", p);
}

void sha512(void)
{
	SHA512_CTX c;
	unsigned char md[SHA512_DIGEST_LENGTH];
	char *p;

	SHA512((unsigned char *)s1, s1_len, md);
	p = pt(md, SHA512_DIGEST_LENGTH);
	printf("SHA512	: %s\n", p);

	SHA512_Init(&c);
	SHA512_Update(&c, s1, s1_len);
	SHA512_Final(md, &c);
	OPENSSL_cleanse(&c, sizeof(c));
	p = pt(md, SHA512_DIGEST_LENGTH);
	printf("SHA512	: %s\n", p);
}

int main(int argc, char *argv[])
{
	if (argc > 1) {
		s1 = argv[1];
	}
	s1_len = strlen(s1);

	printf("calculating SHA* on '%s'\n", s1);

	sha();
	sha1();
	sha224();
	sha256();
	sha384();
	sha512();

	return 0;
}

 

运行结果

 

$ gcc -Wall -lcrypto sha.c


$ ./a.out
calculating SHA* on 'abc'
SHA     : 0164b8a914cd2a5e74c4f7ff082c4d97f1edf880
SHA     : 0164b8a914cd2a5e74c4f7ff082c4d97f1edf880
SHA1    : a9993e364706816aba3e25717850c26c9cd0d89d
SHA1    : a9993e364706816aba3e25717850c26c9cd0d89d
SHA224  : 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
SHA224  : 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
SHA256  : ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA256  : ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
SHA384  : cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
SHA384  : cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
SHA512  : ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
SHA512  : ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f


$ ./a.out 123
calculating SHA* on '123'
SHA     : 4f797c608cab4a00501447df8ee8833f363ea7d3
SHA     : 4f797c608cab4a00501447df8ee8833f363ea7d3
SHA1    : 40bd001563085fc35165329ea1ff5c5ecbdbbeef
SHA1    : 40bd001563085fc35165329ea1ff5c5ecbdbbeef
SHA224  : 78d8045d684abd2eece923758f3cd781489df3a48e1278982466017f
SHA224  : 78d8045d684abd2eece923758f3cd781489df3a48e1278982466017f
SHA256  : a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
SHA256  : a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
SHA384  : 9a0a82f0c0cf31470d7affede3406cc9aa8410671520b727044eda15b4c25532a9b5cd8aaf9cec4919d76255b6bfb00f
SHA384  : 9a0a82f0c0cf31470d7affede3406cc9aa8410671520b727044eda15b4c25532a9b5cd8aaf9cec4919d76255b6bfb00f
SHA512  : 3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2
SHA512  : 3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2

 

    原文作者:哈希算法
    原文地址: https://blog.csdn.net/zahuopuboss/article/details/9632009
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞