Tesla4o
@Tesla4o
Без пользы жизнь - безвременная смерть... В. Гете

Почему не получается верифицировать подпись на С++ сделанную на Python?

Создаю на Python публичный приватный ключи, после чего подписываю приватным строку, отправляю по сети хекс сигнатуры и публичный ключ, на той стороне проверяю C++ кодом либой Openssl/ RSA_verify. И пишет что подпись не валидная. Пробовал на плюсах сделать сигнатуру этим же приватным и ту же строку, то хекс от сигнатуры вообще другой получается. Я так понимаю алгоритмы разные у разных либ/языков?

Вот как создаю ключи на Питоне:
public, private = rsa.newkeys(len_key)
    pub = public.save_pkcs1()
    pri = private.save_pkcs1()


Делаю подпись
signatur = rsa.sign(data, rsa.PrivateKey.load_pkcs1(privateKey), 'SHA-512')


Чекаю на плюсах:
RSA_verify(NID_sha512, (const unsigned char*) text.c_str(), text.length(), (const unsigned char*) sign.c_str(), sign.length(), publicRSA);


Пробовал на Python использовать pyOpenSSL, но это не помогло.
Кто что подскажет? в чем косяк?
  • Вопрос задан
  • 233 просмотра
Решения вопроса 1
SerJook
@SerJook
кодер
Потому что на вход RSA_verify надо подавать хэш данных, а не сами данные.

std::string text = "hello world";
SHA512_CTX sha_ctx = { 0 };
unsigned char digest[SHA512_DIGEST_LENGTH];
SHA512_Init(&sha_ctx);
SHA512_Update(&sha_ctx, text.data(), text.length());
SHA512_Final(digest, &sha_ctx);

if (RSA_verify(NID_sha512, digest, SHA512_DIGEST_LENGTH, (const unsigned char*)sign.data(), sign.length(), publicRSA) == 1) {
   // Успех
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Мне кажется косяк в этих конструкция
text.c_str()
Строка в С заканчивается символом \0
Перед передачей этих параметров обрежтие 1 последний символ, или попробуйте указывать длину как text.length()-1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы