【问题标题】:MD5 Hashing function outputs garbageMD5 哈希函数输出垃圾
【发布时间】:2013-02-12 03:13:18
【问题描述】:

我正在研究一个 C++ 类,我们正在学习 MD5 散列函数。但是,我遇到了这个问题,我在其中执行以下操作:

string input = "testInput";
unsigned char *toHash = new unsigned char[input.size()+1];
strcpy( (char*)toHash, input.c_str() );

unsigned char output[MD5_DIGEST_LENGTH];

MD5(toHash, input.size(), output);

cout << hex << output << endl;

但我总是得到一些奇怪的垃圾字符,而不是我正在寻找的东西,比如一长串数字/字母。怎么回事?

~ 被低级 C++ 搞糊涂了

【问题讨论】:

  • 哈希函数生成包含哈希的二进制字符串;您需要将其转换为十六进制或您想使用的任何其他表示形式。
  • 那个“垃圾”也被称为 md5 摘要。 :-)
  • 所以,一些字符将是控制字符(0x00..0x1F,0x7F..0x9F);任何空字节都将“空终止”您的“字符串”。一些字符将是 ASCII(假设是普通代码集,例如 CP1252 或 8859-1),其余字符将是重音字符或其他特殊标点符号等。无论哪种方式,它看起来都像“垃圾”。您需要分别打印每个字节,可能是 2 个十六进制数字。
  • @user1288167,它们解释为无符号字符。您认为某些角色是“垃圾”的事实是无关紧要的。您实际上希望输出是什么?一个十六进制数字序列?
  • @user1288167 MD​​5 哈希是源数据的二进制摘要。如果您希望它是十六进制字符串形式,则将每个字节转换为一对 alpha 字符('0'..9,'A'..'F')并将它们存储在一个字符串中。

标签: c++ hex md5 output


【解决方案1】:

不要被数组的“无符号字符”类型所迷惑,这意味着数组中的每个值都是一个 8 位无符号整数。特别是它并不暗示写入数组的数据将是人类可读的 ASCII 字符。

如果你想以人类可读的十六进制形式查看数组的内容,你可以这样做(而不是 cout 命令):

for (int i=0; i< MD5_DIGEST_LENGTH; i++) printf("%02x ", output[i]);
printf("\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2012-05-28
    • 2020-12-08
    相关资源
    最近更新 更多