Как хэшировать с ed25519-донной

Я прошу прощения за то, что задал какой-то программный вопрос, но хочу быть уверен, что я правильно использую эту библиотеку криптографически.

Мне удалось реализовать ed25519-donna за исключением хеширования данных для подписи.

Насколько я могу судить, это функция, которая хэширует данные:

void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);

но я не могу понять, что такое * хэш. Я уверен, что *in а также inlen данные для хеширования и их длина.

Это что-то конкретное для SHA512?

Как можно хэшировать с ed25519-донной?


Программа зависает

Я собрал с ed25519-donna-master/ed25519.o и флаги OpenSSL -lssl -lcrypto, Функции генерации, подписи и проверки ключей работают должным образом.

Он работает без ошибок, но приложение зависает на этих линиях, а ядра работают не на 100%, поэтому я не думаю, что он занят обработкой:

extern "C"
{
  #include "ed25519-donna-master/ed25519.h"
  #include "ed25519-donna-master/ed25519-hash.h"
}
#include <openssl/rand.h>

unsigned char* hash;
const unsigned char* in = convertStringToUnsignedCharStar( myString );
std::cout << in << std::endl;
std::cout << "this is the last portion output and 'in' outputs correctly" << std::endl;
ed25519_hash(hash, in, sizeof(in) );
std::cout << hash << std::endl;
std::cout << "this is never output" << std::endl;   

Как этот код может быть изменен так, чтобы ed25519_hash может функционировать? Работает одинаково независимо от того, hash а также in являются unsigned char* или же uint8_t*s.

За uint8_t*Я использовал этот код:

uint8_t* hash;
const uint8_t* in = reinterpret_cast<const uint8_t*>(myString.c_str());

1 ответ

Решение

"… Но я не могу понять, что такое хэш".

Тот uint8_t *hash это буфер (unsigned char*), который будет содержать результирующий хеш после того, как вы вызвали функцию.

Итак, вы смотрите на функцию, которая ожидает 3 параметра (также известные как аргументы):

  1. uint8_t * буфер для хранения полученного хеша,
  2. входные данные для хеширования,
  3. длина входных данных для хеширования.

"Это что-то особенное для SHA512?"

Нет, это обычный источник Си. Но я думаю, что вы немного смущены документацией. Говорится…

If you are not compiling against OpenSSL, you will need a hash function.
…
To use a custom hash function, use -DED25519_CUSTOMHASH
when compiling ed25519.c and put your custom hash implementation
in ed25519-hash-custom.h. The hash must have a 512bit digest and
implement
…
void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);

Таким образом, если вы не компилируете с OpenSSL и не реализуете свою собственную хеш-функцию, вам не понадобится эта функция. Глядя на свой код, вы компилируете против OpenSSL, что означает, что вы играете с неправильной функцией.

"Как можно хэшировать с ed25519-донной?"

Используя предоставленную функциональность библиотека предлагает.

Ваш вопрос заставляет меня задуматься, прокрутили ли вы до раздела "Использование" в файле readme, потому что он полностью отвечает на ваш вопрос и говорит, какие функции использовать.

Для вашего удобства позвольте мне указать вам часть документации, которой вы должны следовать, и где вы найдете функции, которые вам нужны для хеширования, подписи, проверки и т. Д. С помощью ed25519-donna:

Чтобы использовать код, создайте ссылку на ed25519.o -mbits и:

#include "ed25519.h"

Добавьте -lssl -lcrypto при использовании OpenSSL (Некоторые системы не нуждаются в -lcrypto? Это может быть методом проб и ошибок).

Чтобы сгенерировать закрытый ключ, просто сгенерируйте 32 байта из безопасного криптографического источника:

ed25519_secret_key sk;
randombytes(sk, sizeof(ed25519_secret_key));

Чтобы создать открытый ключ:

ed25519_public_key pk;
ed25519_publickey(sk, pk);

Чтобы подписать сообщение:

ed25519_signature sig;
ed25519_sign(message, message_len, sk, pk, signature);

Чтобы проверить подпись:

int valid = ed25519_sign_open(message, message_len, pk, signature) == 0;

Для пакетной проверки подписей:

const unsigned char *mp[num] = {message1, message2..}
size_t ml[num] = {message_len1, message_len2..}
const unsigned char *pkp[num] = {pk1, pk2..}
const unsigned char *sigp[num] = {signature1, signature2..}
int valid[num]

/* valid[i] will be set to 1 if the individual signature was valid, 0 otherwise */
int all_valid = ed25519_sign_open_batch(mp, ml, pkp, sigp, num, valid) == 0;

...

Как видите, все это есть... просто следуйте документации.

Другие вопросы по тегам