通过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 <stdio.h>
#include <string.h>
#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

最后欢迎大家一起学习一些其他c/c++技术:

(21条消息) 收集一些c/c++技术_GT19930910的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值