libsodium crypto_sign_open returns 未签名的消息添加了一些字符
libsodium crypto_sign_open returns unsigned message adding some characters
在我的 C++ 项目中,我使用 libsodium 库来创建和验证消息的签名。
为了验证签名,我以这种方式使用 libsodium crypto_sign_open
函数
bool Signature::signatureVerification(const char* content, unsigned char* unsigned_message)
{
bool verified;
unsigned long long unsigned_message_len;
if (crypto_sign_open(unsigned_message, &unsigned_message_len, (const unsigned char *)content, signed_message_len, pk) != 0)
{
verified = false;
std::cout << "incorrect signature " << std::endl;
}
else{
verified = true;
}
//print variable unsigned_message
return verified;
}
如果我 "print" 变量 unsigned_message
我得到未签名的消息,后跟一些来自签名的字符。例如,如果消息是'hello',在签名验证之后我得到'hello�*�'。
目前我"solved"问题是使用消息的原始长度(存储在变量unsigned_message_len
中)来截断函数返回的消息。
可能是什么问题?为什么在 unsigned_message
变量中有一些额外的字符而不仅仅是原始消息?
谢谢
那是因为您没有空终止符,请尝试在 unsigned_message 之后添加 + 1,无论它是从哪里打印的。您的代码显然会在文本之后打印出随机字符,因为它是 'unisgned' 意味着它没有带符号的数据位值。 + 1 应该终止随机符号。
对于初学者来说,unsigned_message
应该预先分配以便接收 unsigned_message_len
字节。
是这样吗?您的代码片段没有显示该部分。
原始消息的长度是否包括终止符 [=12=]
?
如果您使用 strlen()
,则情况并非如此,因此打印它会打印您的字符串,然后是任何内容,直到(意外地)内存中某处出现 [=12=]
字节。或者直到它遇到保护页面并崩溃。
这里的问题与签名无关。如果字符串没有明确的长度,则必须以零结尾。
在我的 C++ 项目中,我使用 libsodium 库来创建和验证消息的签名。
为了验证签名,我以这种方式使用 libsodium crypto_sign_open
函数
bool Signature::signatureVerification(const char* content, unsigned char* unsigned_message)
{
bool verified;
unsigned long long unsigned_message_len;
if (crypto_sign_open(unsigned_message, &unsigned_message_len, (const unsigned char *)content, signed_message_len, pk) != 0)
{
verified = false;
std::cout << "incorrect signature " << std::endl;
}
else{
verified = true;
}
//print variable unsigned_message
return verified;
}
如果我 "print" 变量 unsigned_message
我得到未签名的消息,后跟一些来自签名的字符。例如,如果消息是'hello',在签名验证之后我得到'hello�*�'。
目前我"solved"问题是使用消息的原始长度(存储在变量unsigned_message_len
中)来截断函数返回的消息。
可能是什么问题?为什么在 unsigned_message
变量中有一些额外的字符而不仅仅是原始消息?
谢谢
那是因为您没有空终止符,请尝试在 unsigned_message 之后添加 + 1,无论它是从哪里打印的。您的代码显然会在文本之后打印出随机字符,因为它是 'unisgned' 意味着它没有带符号的数据位值。 + 1 应该终止随机符号。
对于初学者来说,unsigned_message
应该预先分配以便接收 unsigned_message_len
字节。
是这样吗?您的代码片段没有显示该部分。
原始消息的长度是否包括终止符 [=12=]
?
如果您使用 strlen()
,则情况并非如此,因此打印它会打印您的字符串,然后是任何内容,直到(意外地)内存中某处出现 [=12=]
字节。或者直到它遇到保护页面并崩溃。
这里的问题与签名无关。如果字符串没有明确的长度,则必须以零结尾。