【问题标题】:Why do they want an 'unsigned char*' and not just a normal string or 'char*'为什么他们想要一个 'unsigned char*' 而不仅仅是一个普通的字符串或 'char*'
【发布时间】:2011-10-02 08:22:40
【问题描述】:

编辑:在采取行动之后,我重新安排了参数和类型。但是当我现在调用 digest() 函数时应用程序崩溃了?有什么想法吗?

const std::string message = "to be encrypted";
unsigned char* hashMessage;

SHA256::getInstance()->digest( message, hashMessage ); // crash occurs here, what am I doing wrong?
printf("AFTER: n"); //, hashMessage); // line never reached

我正在使用 C++ 中 SHA256 算法的开源实现。我的问题是了解如何传递我的字符串的 unsigned char* 版本以便对其进行哈希处理?

这是接受我的字符串的 unsigned char* 版本的函数:

void SHA256::digest(const std::string &buf, unsigned char *dig) {
    init();
    update(reinterpret_cast<const unsigned char *>(buf.c_str()), static_cast<unsigned int>(buf.length()));
    final();
    digest(dig);
}

如何将我的字符串(我想要散列)转换为无符号字符*?

我编写的以下代码在打印字符串内容时会导致运行时错误:

const std::string hashOutput;
char message[] = "to be encrypted";

printf("BEFORE: %s bb\n", hashOutput.c_str());
SHA256::getInstance()->digest( hashOutput, reinterpret_cast<unsigned char *>(message) );
printf("AFTER: %s\n", hashOutput.c_str()); // CRASH occurs here

PS:我一直在研究 SHA256 的许多实现,它们都将 unsigned char* 作为要散列的消息。他们为什么这样做?为什么不使用 char* 或字符串呢?

【问题讨论】:

  • 这段代码没有多大意义。为什么你的message 可变你的hashOutput const?你在做什么来避免缓冲区溢出?请添加指向您正在使用的库的文档的链接。
  • @Mankarse:我正在使用这里实现的 sha256 算法:tinypasswordmanager.googlecode.com/svn
  • 请不要以使已经给出的答案不再回答您的问题的方式编辑您的问题。如果这里有一些建议回答了这个问题,那么请接受该建议。如果您遇到更多的问题无法在几个 cmet 中解决,请提出一个新问题。

标签: c++ c hash


【解决方案1】:

你有错误的方式参数。 Buf 是输入(要散列的数据),dig 是输出摘要(散列)。

此外,哈希是二进制数据。在将其打印到屏幕之前,您必须将所述二进制数据转换为某种字符串表示形式。通常,人们为此选择使用十六进制字符串。

【讨论】:

  • 啊,我明白了,我觉得自己很愚蠢:P 我已经做出了改变(见编辑)。现在我在调用 digest() 时崩溃了?
  • @Ryan:十六进制或 base64 都可以正常工作。我自己更喜欢 base64,因为它有点短。
【解决方案2】:

之所以使用unsigned char,是因为它在按位运算、移位和溢出下都有保证的行为。


问题的答案:“为什么会崩溃?”是“你走运了!”。您的代码具有未定义的行为。简而言之,您正在通过一个从未初始化为指向任何内存的指针hashMessage 进行写入。对您正在使用的库的源代码进行简短调查后发现,它需要digest 指针指向至少为SHA256_DIGEST_SIZEchars 长的有效内存块。

要解决这个问题,您需要做的就是确保您作为 digest 参数 (hashMessage) 传入的指针已正确初始化,并指向足够大小的内存块.在代码中:

const std::string message("to be encrypted");
unsigned char hashMessage[SHA256_DIGEST_SIZE];

SHA256::getInstance()->digest( message, hashMessage );

//hashMessage should now contain the hash of message.

【讨论】:

    【解决方案3】:

    我不知道 SHA256 哈希是如何产生的,但它可能涉及某种需要对无符号数据类型进行的算术运算。

    为什么重要?通过调用 c_str() 方法从字符串对象中获取 char*,然后转换为 unsigned char*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多