md5 加密(使用openssl库C)

参考https://blog.csdn.net/zsy19881226/article/details/46879887

依赖openssl里面的-lcrypto  libcrypto.so库
 

#include

 unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
 int MD5_Init(MD5_CTX *c);
 int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
 int MD5_Final(unsigned char *md, MD5_CTX *c);

方法一: 场景---数据较少

 unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);

单独使用这个函数生成unsigned char *md, md可以为数组,长度16即可

方法二: 场景---数据较多,如文件

 int MD5_Init(MD5_CTX *c);
 int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
 int MD5_Final(unsigned char *md, MD5_CTX *c);

MD5_Update传输数据,可以重复使用这个函数直到所有数据更新进去。最后使用MD5_Final即结果返回unsigned char *md里

 

实例:方法二

bool cal_check_number(const char *filename,char *check_number)
{
    char data[1024]={0};
    unsigned char md[16]={0};
    int readbytes=0;
    MD5_CTX ctx;
    MD5_Init(&ctx);

    FILE* file =fopen(filename, "r");
    if(!file){
        printf("fopen failed\n");
        return false;
    }
    
    while(!feof(file) ){
        memset(data,0,sizeof(data));
        if( (readbytes=fread(data,1,sizeof(data),file)) > 0)
            MD5_Update(&ctx, data, readbytes );
    }
    MD5_Final( md , &ctx);
    snprintf(check_number, 33, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",\
        md[0],md[1],md[2],md[3],md[4],md[5],md[6],md[7],\
        md[8],md[9],md[10],md[11],md[12],md[13],md[14],md[15]);
    printf("check_number cal---- [%s]",check_number);
    return true;
}

 

 

你可能感兴趣的:(LINUX,加密校验)