Linux开发中 MD5值的计算

Go语言中crypto/md5包中提供了MD5计算的API,在Linux中,openssl库也提供了类似的接口,编译的时候加上链接选项-lcrypto 就可以使用了。

基本API有两种,一种是MD5(),另一种是分为三个部分,MD5_Init, MD5_Update, MD5_Final,这个适合长度不确定的数据计算:

 #include <openssl/md5.h>

 //d存储待计算的数据,n表示数据的长度,如果md非空,则存储md5值。
 unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);

 //初始化
 int MD5_Init(MD5_CTX *c);
 
 //计算data中长度为len的MD5,当数据很大的情况下,可以分多次计算
 int MD5_Update(MD5_CTX *c, const void *data, unsigned long len);
 
 //得到累计的md5值
 int MD5_Final(unsigned char *md, MD5_CTX *c);

测试用例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>


char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;
}

int main(int argc, char **argv) {
	char *output = str2md5("hello", strlen("hello"));
	printf("%s\n", output);
	free(output);
	return 0;
}

编译运行:

如果出现如下编译错误:

 openssl/md5.h: No such file or directory

解决方案:
sudo apt-get install libpcap-dev libssl-dev

参考文档:

1. https://www.openssl.org/docs/manmaster/man3/MD5.html

2. https://stackoverflow.com/questions/7627723/how-to-create-a-md5-hash-of-a-string-in-c

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值