【问题标题】:Will MD5( libcrypto ) work on string which contain null in between?MD5( libcrypto ) 是否可以处理中间包含 null 的字符串?
【发布时间】:2023-12-24 07:26:01
【问题描述】:

我有两个字符串如下 STR1:1234\099 STR2:123499

如果我使用 unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md); 计算这些字符串的 MD5;

函数 MD5 是否会计算 Str1 的前 4 个字节的哈希值,还是会采用完整的字符串“1234\099”。

Str1和Str2的MD5是一样还是不一样???

谢谢

【问题讨论】:

    标签: c encryption md5


    【解决方案1】:

    这完全取决于您为n 参数传递的值。

    如果你使用strlen() 来计算n,那么MD5() 函数将处理数据,直到但不包括空值(因为你告诉它,实际上)。

    如果你为n 传入正确的长度(我假设Str1 的长度是7),那么MD5() 将包含散列中的所有数据,包括空字节和空值之后的数据。

    Str1Str2 的哈希值将不同(假设您为 n 传递大于 3 的值)。

    【讨论】:

      【解决方案2】:

      const unsigned char *d 它是数组的第一个元素,而不是 C 样式的字符串。

      因此指定(const unsigned char *)"1234\099" 的适当长度(7 个元素),您将获得其MD5 到md

      【讨论】:

        【解决方案3】:

        是的,迈克尔是对的。我执行了下面的程序,似乎 MD5 计算发生在第二个参数上,而与字符串中的内容无关。

        #include <stdio.h>
        #include <openssl/md5.h>
        
        int main() { <br>
            char *p = NULL;<br>
            char *c = NULL;<br>
            char *q = NULL;<br>
        
            p = malloc(10*(sizeof(char)));
            strncpy(p, "ABCDEDFGO", 9);
            c = malloc(200*(sizeof(char)));
            memset(c,0, 200);
        
            p[3] = '\0';
        
            q = MD5(p, 9, c);
            printf("\n For 9 bytes hash %x", *c);
            q = MD5(p, 4, c);
            printf("\n For 4 bytes hash %x", *c);
            q = MD5(p, 3, c);
            printf("\n For 3 bytes hash %x", *c);
        
            free(c);
            return (0);
        }
        

        对于 9 个字节的哈希 ffffffc9
        对于 4 字节哈希 ffffffe5
        对于 3 个字节的哈希 ffffff90

        【讨论】:

          最近更新 更多