当前位置: 首页 > news >正文

[ 加密 ] 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;
}

http://www.lryc.cn/news/237901.html

相关文章:

  • 推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
  • 《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar
  • 风丘电动汽车热管理方案 为您的汽车研发保驾护航
  • 每日一练 | 华为认证真题练习Day134
  • python连接hive报错:TypeError: can‘t concat str to bytes
  • 虹科示波器 | 汽车免拆检修 | 2015款奔驰G63AMG车发动机偶尔自动熄火
  • 10 Redis的持久化
  • 【Linux入侵日志排查】
  • 从哪些方面分析Linux内核源码
  • C#WPF数据模板应用实例
  • ansible练习题1
  • 六大排序详讲(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序)
  • Clickhouse初认识
  • 网络安全项目简介
  • CSDN每日一题学习训练——Python版(N皇后 II、买卖股票的最佳时机 II、编程通过键盘输入每一位运动员)
  • semodule工具详解(1)
  • 用百度AI大模型给头像换风格
  • 从入门到精通,mac电脑录屏软件使用教程!
  • Nginx(反向代理,负载均衡,动静分离)
  • 【Spring】SpringBoot的扩展点之ApplicationContextInitializer
  • 哈希表HashTable
  • 【软件测试】一位优秀测试工程师具备哪些知识和经验?
  • MongoDB相关基础操作(库、集合、文档)
  • 进程和线程( Process and Thread)
  • linux apache安装及虚拟主机配置
  • 基于Spring Boot 框架的试卷自动生成系统的设计与实现
  • 开发《猫咪攻略》小游戏的意义
  • hadoop、hive、DBeaver的环境搭建及使用
  • Linux上通过SSL/TLS和start tls连接到LDAP服务器(附C++代码实现认证流程)
  • HarmonyOS ArkTS List组件和Grid组件的使用(五)