库的安装及使用
安装相应库
sudo apt install libssl-dev
代码中需要引入头文件
#include <openssl/sha.h>
编译时需要指定库 -lcrypto
gcc sha1_test.c -lcrypto
使用方法
如果数据可以一次性获得
size_t len = strlen(data);
unsigned char sha1[SHA_DIGEST_LENGTH];
SHA1(data, len, sha1);
如果数据分批获得
SHA_CTX c;
unsigned char sha1[SHA_DIGEST_LENGTH];
SHA1_Init(&c); /* 初始化 SHA_CTX */
for (i = 0; i< num; ++i) {
len = strlen(data[i]);
SHA1_Update(&c, data[i], len); /* 添加数据 */
}
SHA1_Final(sha1, &c);
示例
完整代码
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
#define BUFF_LENGTH SHA_DIGEST_LENGTH * 2
char * sha1_to_hex(unsigned char *sha1)
{
static char buffer[BUFF_LENGTH];
static const char hex[] = "0123456789abcdef";
char *buf = buffer;
int i;
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
unsigned int val = *sha1++;
*buf++ = hex[val >> 4];
*buf++ = hex[val & 0xf];
}
return buffer;
}
void print_sha1(unsigned char *sha1)
{
int i;
char *buff = sha1_to_hex(sha1);
for (i = 0; i< BUFF_LENGTH; ++i) {
printf("%c", buff[i]);
}
printf("\n");
}
void gen_sha1_once(char *data)
{
size_t len = strlen(data);
unsigned char sha1[SHA_DIGEST_LENGTH];
SHA1(data, len, sha1);
print_sha1(sha1);
}
void gen_sha1_piece(char **data, int num)
{
int i;
size_t len;
SHA_CTX c;
unsigned char sha1[SHA_DIGEST_LENGTH];
SHA1_Init(&c);
for (i = 0; i< num; ++i) {
len = strlen(data[i]);
SHA1_Update(&c, data[i], len);
}
SHA1_Final(sha1, &c);
print_sha1(sha1);
}
int main(int argc, char **argv)
{
char data_once[] = "hello world!";
char *data_piece[] = {"hello ", "world!"};
gen_sha1_once(data_once);
gen_sha1_piece(data_piece, 2);
return 0;
}
结果对比
上面代码的运行结果为
430ce34d020724ed75a196dfc2ad67c77772d169
430ce34d020724ed75a196dfc2ad67c77772d169
使用命令行作为对比
$ echo -n "hello world!" | shasum -a 1
430ce34d020724ed75a196dfc2ad67c77772d169 -
可以看出上述代码结果正确。
参考: