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=] 字节。或者直到它遇到保护页面并崩溃。

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