且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何创建在C字符串的MD5哈希?

更新时间:2023-11-15 16:48:46

我不知道这个特殊的库,但我已经用非常类似的电话。所以这是我***的猜测:

  unsigned char型消化[16];
为const char *字符串=Hello World的;
结构MD5Context语境;
MD5Init(安培;背景);
MD5Update(安培,背景,字符串的strlen(字符串));
MD5Final(消化,&安培;背景);

这会给你回重新散列presentation一个整数。然后,您可以,如果你想围绕把它作为一个字符串转成十六进制再presentation这一点。

 字符md5string [33];
的for(int i = 0; I< 16; ++ I)
    sprintf的(安培; md5string [我* 2],%02X(无符号整数)摘要[I]);

I've found some md5 code that consists of the following prototypes...

I've been trying to find out where I have to put the string I want to hash, what functions I need to call, and where to find the string once it has been hashed. I'm confused with regards to what the uint32 buf[4] and uint32 bits[2] are in the struct.

struct MD5Context {
    uint32 buf[4];
    uint32 bits[2];
    unsigned char in[64];
};

/*
 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
 * initialization constants.
 */
void MD5Init(struct MD5Context *context);

/*
 * Update context to reflect the concatenation of another buffer full
 * of bytes.
 */
void MD5Update(struct MD5Context *context, unsigned char const *buf, unsigned len);

/*
 * Final wrapup - pad to 64-byte boundary with the bit pattern 
 * 1 0* (64-bit count of bits processed, MSB-first)
 */
void MD5Final(unsigned char digest[16], struct MD5Context *context);

/*
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 * reflect the addition of 16 longwords of new data.  MD5Update blocks
 * the data and converts bytes into longwords for this routine.
 */
void MD5Transform(uint32 buf[4], uint32 const in[16]);

I don't know this particular library, but I've used very similar calls. So this is my best guess:

unsigned char digest[16];
const char* string = "Hello World";
struct MD5Context context;
MD5Init(&context);
MD5Update(&context, string, strlen(string));
MD5Final(digest, &context);

This will give you back an integer representation of the hash. You can then turn this into a hex representation if you want to pass it around as a string.

char md5string[33];
for(int i = 0; i < 16; ++i)
    sprintf(&md5string[i*2], "%02x", (unsigned int)digest[i]);