【问题标题】:libsodium crypto_sign_open returns unsigned message adding some characterslibsodium crypto_sign_open 返回添加一些字符的未签名消息
【发布时间】:2019-03-23 19:20:02
【问题描述】:

在我的 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,我会收到未签名的消息,后跟来自签名的一些字符。例如,如果消息是“你好”,在签名验证后我会得到“你好...*...”。

现在我使用消息的原始长度(存储在变量unsigned_message_len)来“解决”这个问题,以截断函数返回的消息。

可能是什么问题?为什么在unsigned_message 变量中有一些额外的字符,而不仅仅是原始消息?

谢谢

【问题讨论】:

    标签: c++ libsodium


    【解决方案1】:

    那是因为您没有空终止符,请尝试在 unsigned_message 之后添加 + 1,无论从哪里打印。您的代码显然会在文本之后打印出随机字符,因为它是“未签名的”,这意味着它没有签名的数据位值。 + 1 应该终止随机符号。

    【讨论】:

    • 问题不在于变量的打印,我使用变量的值作为标识符但是这样我永远不会得到正确的 id。
    • 我意识到这一点,我的回答是您缺少一个空字符或零终止字符。如果您使用 strlen 则没有必要,但其他明智的做法是 std::cout 或 print unsigned_message 它必须是 unsigned_message + 1 才能终止您描述的其余字符符号。
    【解决方案2】:

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

    是这样吗?您的代码 sn-p 没有显示该部分。

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

    如果您使用strlen(),情况并非如此,因此打印它会打印您的字符串,然后打印任何内容,直到内存中某处(偶然)出现\0 字节。或者直到它到达保护页面并崩溃。

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

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2019-02-23
      • 1970-01-01
      • 2021-02-25
      • 2019-09-15
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多