libsodium crypto_sign_open возвращает неподписанное сообщение с добавлением некоторых символов - PullRequest
1 голос
/ 23 марта 2019

В моем 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 есть некоторые дополнительные символы, а не только исходное сообщение?

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Это потому, что у вас нет нулевого терминатора, попробуйте добавить + 1 после unsigned_message, где бы он ни печатался. Ваш код, очевидно, будет печатать случайные символы после текста, потому что он «неопознанный», то есть у него нет битового значения со знаком. + 1 должен завершать случайные символы.

0 голосов
/ 24 марта 2019

Для начала, unsigned_message должен быть предварительно выделен для получения unsigned_message_len байтов.

Это так? Ваш фрагмент кода не показывает эту часть.

Включена ли в длину исходного сообщения завершающая \0?

Если вы использовали strlen(), это не тот случай, поэтому при печати он будет печатать вашу строку, после чего следует что угодно, пока (случайно) не появится \0 байт где-нибудь в памяти. Или до тех пор, пока он не попадет на страницу охраны и не рухнет.

Проблема здесь не в сигнатурах. Строки должны заканчиваться нулем, если они не имеют явной длины.

...