• 通过openssl库计算字符串或文件sha256


     需求

            文件传输之后校验文件完整性。

    方法

            通过openssl库计算传输前后文件sha256值并对比,相同则完整。

    测试方法

            linux:执行命令     openssl sha256 ./test.zip

            windows:SHA256文件HASH值生成-在线工具 (51strive.com)

    代码

    //apt install libssl-dev openssl
    //pkg-config --cflags --libs openssl
    //gcc openssl.c -lssl -lcrypto

    #include
    #include
    #include "openssl/sha.h"

    int sha256str(const char *readstr, unsigned char *md)
    {
        if (SHA256((unsigned char*)readstr, strlen(readstr), md) == NULL) {
            printf("sha256 erro\n");
            return -1;
        }    
        return 0;
    }

    void printf256(unsigned char *md)
    {
        for (int i = 0; i < 32; i++) {
            printf("%02x", md[i]);
        }
        printf("\n");
    }

    void printfbuf(unsigned char *buf)
    {
        for (int i = 0; i < strlen(buf); i++) {
            printf("%d:%c\n", i, buf[i]);
        }
        printf("\n");
    }

    int sha256file(const char *filepath, unsigned char *md)
    {
        FILE* fp;
        SHA256_CTX ctx;
        char buf[SHA256_DIGEST_LENGTH] = {0};
        /* 打开预加密文件 */
        fp = fopen(filepath, "rb");
        if (fp == NULL) {
            printf("Can't open %s\n", filepath);
            return -1;
        }
        /* 初始化指针 */
        SHA256_Init(&ctx);
        
        int len = 0;
        int t = 0;

        /* 对读取的块数据进行加密更新 */
        while (!feof(fp)) {
            memset(buf, 0, sizeof(buf));
            len = fread(buf, 1, SHA256_DIGEST_LENGTH, fp);
            if (len > 0)
            {
                t += len;

                //若检验文本文件使用"r"代替"rb",而且会多读到最后一个换行符,和字符串加密之后的不一样,printfbuf可打印读到的文件内容(内容手写一行字符串)发现最后多一个字符
                //printfbuf(buf);

                SHA256_Update(&ctx, buf, len);//加入新的文件块
            }
        }
        printf("total len: %d\n", t);
        /* 生成最终的加密哈希 */
        SHA256_Final(md, &ctx);
        fclose(fp);
        return 0;
    }

    int main()
    {
        char str[] = "123456789";
        unsigned char md[32];
        memset(md, 0, 32);
        //sha256str(str, md);
        sha256file("./test.zip", md);
        printf256(md);

        return 0;
    }

    环境以及编译方法

            apt install libssl-dev openssl
            gcc openssl.c -lssl -lcrypto

  • 相关阅读:
    R²决定系数
    Linux进程终止
    pointnet点云分类,matlab,程序可用,修改一个参数
    JVM学习五
    [附源码]计算机毕业设计springboot酒店客房管理信息系统
    对于两个独立随机变量X,Y, E(XY)=E(X)E(Y)
    Oracle数据库备份与恢复exp/imp命令
    上游模式用于实验室用冷冻机压力和真空度的高精度控制
    react 路由拦截通过tocken进行简单拦截
    linux命令学习(14)——linux tar命令
  • 原文地址:https://blog.csdn.net/FlayHigherGT/article/details/126374877