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