libsodium crypto_sign_open返回未签名的消息,添加一些字符

时间:2019-03-23 19:20:02

标签: c++ libsodium

在我的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变量中有一些其他字符,而不仅仅是原始消息?

谢谢

2 个答案:

答案 0 :(得分:2)

那是因为您没有null终止符,因此无论从何处打印,都应尝试在unsigned_message之后添加+1。您的代码显然将在文本后打印出随机字符,因为它是“已识别”的,这意味着它没有带符号的数据位值。 +1应该终止随机符号。

答案 1 :(得分:0)

对于初学者来说,unsigned_message应该已经预先分配以便接收unsigned_message_len字节。

是这样吗?您的代码段未显示该部分。

原始消息的长度是否包括终止符\0

如果您使用的是strlen(),则不是这样,因此打印它会打印您的字符串,然后打印所有内容,直到(偶然)在内存中的某个地方\0个字节为止。或直到它碰到保护页面并崩溃。

这里的问题实际上与签名无关。如果字符串没有明确的长度,则必须以零结尾。