Как хэшировать с 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 параметра (также известные как аргументы):
uint8_t *
буфер для хранения полученного хеша,- входные данные для хеширования,
- длина входных данных для хеширования.
"Это что-то особенное для 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;
...
Как видите, все это есть... просто следуйте документации.