23 Aug 2006

Linux MD5 programming in C Language

MD5(Message Digest, Unoffical Homepage, Wikipedia, rfc1321) 是 Ronald L. Rivest 教授发明的不可逆加密算法,广泛应用于检查数据的完整性。任意长度的输入(IV)经 MD5 处理后都产生 128-bit/16-byte 的 Hash 值。Slackware 就使用 md5 保证软件的完整性。

不过,在 2004 年 8 月,当时在山大的王小云教授及其合作者发现了 MD5 的 弱点。迄今为止,SHA-0, SHA-1, MD4, MD5, HAVAL-128 和 RIPEMD 等加密算法都被证明存在弱点。

这里是一个 MD5 数据库,可以进行双向查询。

看到一个有意思的 说法
"人生就是个MD5算法,它不可逆,而每个人也都是一个自变量,因此每个人的MD5值都不一样。目前MD5可以解密了,想要解密人生,也不是不可以。"

来点实在的,在 Linux 调用 openssl 的 libcrypto.so* 库加密字符串:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/md5.h>

int main(int argc, char *argv[])
{
char password[68] = {0};
MD5_CTX x;
int i = 0, len;
char *out = NULL;
unsigned char d[16];
unsigned char tmp[128] = { 0 };

if (argc != 2) {
printf("Usage: %s <message>\n", argv[0]);
return -1;
}

strcpy(password, argv[1]);

MD5_Init(&x);
MD5_Update (&x, (char *) password, strlen(password));
MD5_Final(d, &x);
out = malloc(35);
memset(out, 0x00, 35);
strcpy(out, "$1$");
printf ("MD5(\"%s\") = ", password);
for (i = 0; i < 16; i++) {
sprintf (out + (i*2), "%02X", d[i]);
}
out[32] = 0;
printf ("%s\n", out);

return 0;
}
编译的时候记得调用 libcrypt.so :
gcc -Wall -o md5 md5.c -lcrypto

3 comments:

  1. char password[68] 呵呵,有长度限制呀^_^

    ReplyDelete
  2. sirtoozee, 这只是一个例程,记录一下怎么调用 openssl 进行 md5 加密。

    ReplyDelete
  3. welcome to the wow power leveling cheap Wow gold service site, buy cheap wow gold,wow gold,world of warcraft power leveling buy wow gold

    ReplyDelete