md5密码的意思就是通过md5加密方式生成的密码,解密就是将已经加密的密码通过一些处理,将密码还原成原来的模样。
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
题中所示代码中,python实现了计算空字符串的MD5值,并对MD5的值的十六进制的字符串所表示的字节进行BASE64处理。
不像Python内部有实现md5功能,根据ANSI C标准,C语言的标准库里是没有md5功能的;
但是RFC1231规定了MD5功能的C实现并提供了附件,可以直接用,也可以直接获取现成的实现,在编译链接时指定正确的.h头文件和.lib静态链接库文件;
这里我采取前者的做法(电脑上没有装VC,有VC就简单很多,使用的是minGW)大概六七百行代码左右。
然后这里展示不完,给个实现效果图
这是我整理的实现代码,其中BASE64部分使用了github上littlestar的b64.c,然后MD5计算部分直接参考了RFC1231标准的附录。RFC1231文件有计算方法
BASE64的编码原理
#include stdio.h
#include stdlib.h
#include string.h
#if defined(__APPLE__)
# define COMMON_DIGEST_FOR_OPENSSL
# include CommonCrypto/CommonDigest.h
# define SHA1 CC_SHA1
#else
# include openssl/md5.h
#endif
// 这是我自己写的函数,用于计算MD5
// 参数 str:要转换的字符串
// 参数 lengthL: 字符串的长度 可以用 strlen(str) 直接获取参数str的长度
// 返回值:MD5字符串
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);
// 上面会输出 hello的MD5字符串:
// 5d41402abc4b2a76b9719d911017c592
free(output);
return 0;
}
相关库函数如下:
#include openssl/md5.h
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);