[ 加密 ] SHA256

SHA256 例程

一般文件的完整性要使用md5或者sha进行完整性校验,这里提供两个函数,

intact_update_sha 是计算指定文件SHA值并保存到SHA文件

intact_check_sha 计算文件SHA值并和SHA文件进行对比

编译方法:

gcc demo.c -lssl -lcrypto

#include <stdio.h>
#include <openssl/sha.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <openssl/md5.h>
#include <stdlib.h>

enum {
    ERR_OK,
    ERR_FAIL,
    ERR_OPEN,
    ERR_OPEN_SHA,
    ERR_PATH,
    ERR_PARAM,
    ERR_NOEXIST,
    ERR_NOEXIST_SHA,
    ERR_KEY,
    ERR_MALLOC,

};

#define MAX_BUFFER_SIZE      1024
#define SHA_FILE_PATH        "/home/hfs/sha/%s.sha"
#define SHA_FILE_DIR         "/home/hfs/sha"

static int intact_get_sha_file_path(char *path)
{
    int offset = 0;
    for (int i = 0; i < strlen(path); i++) {
       if (*(path + i) == '/')
           offset = i;
    }
    return offset;
}
int intact_check_sha(char *path)
{
    SHA256_CTX ctx;
    char buffer[MAX_BUFFER_SIZE];
    char sha_str[MAX_BUFFER_SIZE];
    int len = 0;
    FILE *fp = NULL;
    FILE *fp_sha = NULL;
    unsigned char sha[SHA256_DIGEST_LENGTH];
    char tmp[MAX_BUFFER_SIZE] = {0};
    char sha_file[MAX_BUFFER_SIZE] = {0};
    int offset;
    if (path == NULL) {
    return ERR_PARAM;
    }
    if (access(path, F_OK)) {
        return ERR_NOEXIST;
    }
    strcpy(tmp, path);
    if (tmp[strlen(tmp) - 1] == '/') {
        tmp[strlen(tmp) - 1] = '\0';
    }
    
    offset = intact_get_sha_file_path(tmp);
    if (offset == 0) {
        return ERR_PATH;
    }
    sprintf(sha_file, SHA_FILE_PATH, tmp + offset + 1);
    if (access(sha_file, F_OK)) {
        return ERR_NOEXIST_SHA;
    }
    fp = fopen(path, "r");
    if (fp == NULL) {  
        return ERR_OPEN;  
    }
    fp_sha = fopen(sha_file, "r");
    if (fp == NULL) {  
        fclose(fp);
        fp = NULL;
        return ERR_OPEN_SHA;  
    } 

    SHA256_Init(&ctx);
    while ((len = fread(buffer, 1, MAX_BUFFER_SIZE, fp)) > 0) {
        SHA256_Update(&ctx, buffer, len);  
        memset(buffer, 0, sizeof(buffer));  
    } 
    SHA256_Final(&(sha[0]), &ctx);
    sprintf(sha_str, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
           sha[0], sha[1], sha[2], sha[3], sha[4], sha[5], sha[6], sha[7],
           sha[8], sha[9], sha[10], sha[11], sha[12], sha[13], sha[14], sha[15]);
    fread(buffer, 1, MAX_BUFFER_SIZE, fp_sha);
    if (strncmp(sha_str, buffer, 32) == 0) {
        fclose(fp);
        fp = NULL;
        fclose(fp_sha);
        fp_sha = NULL;
        return ERR_OK;
    }
    fclose(fp);
    fp = NULL;
    fclose(fp_sha);
    fp_sha = NULL;
    return ERR_FAIL;
}
int intact_update_sha(char *path)
{
    SHA256_CTX ctx;
    char buffer[MAX_BUFFER_SIZE];
    char sha_str[MAX_BUFFER_SIZE] = {0};
    int len = 0;
    FILE *fp = NULL;
    FILE *fp_sha = NULL;
    unsigned char sha[SHA256_DIGEST_LENGTH];
    char tmp[MAX_BUFFER_SIZE] = {0};
    char sha_file[MAX_BUFFER_SIZE] = {0};
    int offset;
    if (path == NULL) {
    return ERR_PARAM;
    }
    if (access(path, F_OK)) {
        return ERR_NOEXIST;
    }
    strcpy(tmp, path);
    if (tmp[strlen(tmp) - 1] == '/') {
        tmp[strlen(tmp) - 1] = '\0';
    }
    
    offset = intact_get_sha_file_path(tmp);
    if (offset == 0) {
        return ERR_PATH;
    }
    sprintf(sha_file, SHA_FILE_PATH, tmp + offset + 1);
    if (access(SHA_FILE_DIR, F_OK)) {
        mkdir(SHA_FILE_DIR, S_IRUSR | S_IWUSR | S_IXUSR);
    }
    fp = fopen(path, "r");
    if (fp == NULL) {  
        return ERR_OPEN;  
    }
    fp_sha = fopen(sha_file, "w+");
    if (fp == NULL) {  
        fclose(fp);
        fp = NULL;
        return ERR_OPEN_SHA;  
    } 

    SHA256_Init(&ctx);
    while ((len = fread(buffer, 1, MAX_BUFFER_SIZE, fp)) > 0) {
        SHA256_Update(&ctx, buffer, len);  
        memset(buffer, 0, sizeof(buffer));  
    } 
    SHA256_Final(&(sha[0]), &ctx);
    sprintf(sha_str, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
           sha[0], sha[1], sha[2], sha[3], sha[4], sha[5], sha[6], sha[7],
           sha[8], sha[9], sha[10], sha[11], sha[12], sha[13], sha[14], sha[15]);

    fwrite(sha_str, 1, MAX_BUFFER_SIZE, fp_sha);
    fclose(fp);
    fp = NULL;
    fclose(fp_sha);
    fp_sha = NULL;
    return ERR_OK;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值