在我的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;
}
如果我“打印”变量unsigned_message
,则会收到未签名的消息,后跟一些来自签名的字符。例如,如果消息为``hello'',则在签名验证后我得到的是``hello *''。
现在,我使用消息的原始长度(存储在变量unsigned_message_len
中)截断了函数返回的消息,从而“解决了”问题。
可能是什么问题?为什么在unsigned_message
变量中有一些其他字符,而不仅仅是原始消息?
谢谢
答案 0 :(得分:2)
那是因为您没有null终止符,因此无论从何处打印,都应尝试在unsigned_message之后添加+1。您的代码显然将在文本后打印出随机字符,因为它是“已识别”的,这意味着它没有带符号的数据位值。 +1应该终止随机符号。
答案 1 :(得分:0)
对于初学者来说,unsigned_message
应该已经预先分配以便接收unsigned_message_len
字节。
是这样吗?您的代码段未显示该部分。
原始消息的长度是否包括终止符\0
?
如果您使用的是strlen()
,则不是这样,因此打印它会打印您的字符串,然后打印所有内容,直到(偶然)在内存中的某个地方\0
个字节为止。或直到它碰到保护页面并崩溃。
这里的问题实际上与签名无关。如果字符串没有明确的长度,则必须以零结尾。