为什么他们想要一个'unsigned char *'而不仅仅是一个普通的字符串或'char *'

时间:2011-10-02 08:22:41

标签: c++ c hash

编辑:服用adivce之后我重新安排了参数&类型。但是当我现在调用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和AMP的许多实现方式。他们都将unsigned char *作为要散列的消息。他们为什么这样做?为什么不使用char *或字符串?

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

使用unsigned char的原因是它在按位运算,移位和溢出下保证了行为。

char,(当它对应于signed char时)不提供任何这些保证,因此对于旨在直接作用于字符串中的基础位的操作来说,它的可用性要小得多。


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

要解决此问题,您需要做的就是确保作为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.

答案 2 :(得分:-2)

我不知道如何生成SHA256哈希,但可能涉及某种需要在无符号数据类型上完成的算法。

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