linxu c++ md5校验

产看文件的md5值

头文件

#ifndef OPENSSL_MD5_H
#define OPENSSL_MD5_H

#define INPUT_BUFFER_SIZE 100 * 1024

int getMd5Str(const char* data, int length, char* result, int byteSize = 32);
int getMd5File(const char* filePath, char* result, int byteSize = 32);

#endif

执行文件

#include "openssl_md5.h"
#include <openssl/md5.h>
#include <stdio.h>
#include "string.h"


/**
 * @brief Get the Md5 Str object
 * 返回32位的MD5
 * @param  data             My Param doc
 * @param  length           strlen(data)
 * @param  result           返回MD5值,空间要大于33
 * @return int 
 */
int getMd5Str(const char* data, int length, char* result, int byteSize)
{
    MD5_CTX c;
    MD5_Init(&c);
    MD5_Update(&c, data, length);

    unsigned char digest[16] = { 0 };
    char hexBuffer[3];
    MD5_Final(digest, &c);
    result[0] = '\0';
    for (size_t i = 0; i != 16; ++i)
    {
        if (digest[i] < 16)     sprintf(hexBuffer, "0%x", digest[i]);
        else                    sprintf(hexBuffer, "%x", digest[i]);
        strcat(result, hexBuffer);
    }
    result[32] = '\0';

    if(byteSize == 16)
    {
        char temp[17];
        // 如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。
        snprintf(temp, 17, "%s", result + 8);
        temp[16] = '\0';
        sprintf(result, "%s", temp);
    }
    return 0;
}

int getMd5File(const char* filePath, char* result, int byteSize)
{
    FILE *file = fopen(filePath, "rb");
    if (file)
    {
        MD5_CTX c;
        MD5_Init(&c);
        
        char buffer[INPUT_BUFFER_SIZE];
        while (!feof(file))
        {
            size_t numberOfObjects = fread(buffer, sizeof(char), INPUT_BUFFER_SIZE, file);
            MD5_Update(&c, buffer, numberOfObjects);
        }
        fclose(file);

        unsigned char digest[16] = { 0 };
        char hexBuffer[3];
        MD5_Final(digest, &c);
        result[0] = '\0';
        for (size_t i = 0; i != 16; ++i)
        {
            if (digest[i] < 16)     sprintf(hexBuffer, "0%x", digest[i]);
            else                    sprintf(hexBuffer, "%x", digest[i]);
            strcat(result, hexBuffer);
        }
        result[32] = '\0';

        if(byteSize == 16)
        {
            char temp[17];
            snprintf(temp, 17, "%s", result + 8);
            temp[16] = '\0';
            sprintf(result, "%s", temp);
        }
    }
    else
    {
        return 1;
    }
    return 0;
}

测试程序

#include <string.h>
#include "openssl_md5.h"
#include "stdio.h"

int main()
{
    char result[32];
    char *data = "All is well!";
    getMd5Str(data, strlen(data), result);
    printf("%s\n", result);
    getMd5Str(data, strlen(data), result, 16);
    printf("%s\n", result);

    getMd5File("src.zip", result);
    printf("%s\n", result);
    getMd5File("src.zip", result, 16);
    printf("%s\n", result);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向工程应用:市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。 从零实现部分算法: 课程中实现了base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法的实现,从而加深对密码学的理解。理论与实践结合: 课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。代码现场打出: 代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,易学不枯燥: 课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值