Шифрование с использованием libsodium

Я изо всех сил пытался зашифровать / расшифровать некоторые данные с помощью crypto_secretbox_easy() в libsodium. Я не могу найти хорошую документацию по использованию.

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

Проблема с игрушечным кодом, который я выложил ниже, состоит в том, что crypto_secretbox_open_easy() возвращает -1 из verify_16.c. Кто-нибудь есть идеи, где я мог бы найти источник, показывающий, как использовать этот интерфейс или что может пойти не так? Спасибо!

 unsigned char * cipher;
 unsigned char * decoded;
 unsigned char * message;
 unsigned long long message_len = 32;
 size_t noncelen = sizeof(char) * crypto_secretbox_noncebytes();
 size_t keylen = sizeof(char) * crypto_secretbox_keybytes();
 unsigned char * nonce = calloc(noncelen, noncelen);
 unsigned char * key = calloc(keylen, keylen);

 message = calloc(32*sizeof(char), sizeof(char) * 32);
 cipher = calloc(32*sizeof(char), sizeof(char) * 32);
 decoded = calloc(32*sizeof(char), sizeof(char) * 32);

 crypto_secretbox_easy((unsigned char *)cipher, (const unsigned char *)message, 
                      message_len, nonce, key);

 crypto_secretbox_open_easy((unsigned char *)decoded, (const unsigned char *) cipher, 
                            message_len, nonce, key);

2 ответа

Решение

test/secretbox_easy2.c file (в исходном коде натрия) показывает, как его использовать:

randombytes_buf(nonce, sizeof nonce);
crypto_secretbox_easy(c, m, mlen, nonce, k);
crypto_secretbox_open_easy(decoded, c, mlen + crypto_secretbox_MACBYTES,
                           nonce, k);

Чтобы получить ключ из пароля, натрий предоставляет crypto_pwhash_scryptsalsa208sha256,

Размер шифра должен быть на 16 байтов больше, чем сообщение для байтов MAC, поэтому выделите еще 16 байтов, а в open_easy просто добавьте + 16 к message_len.

Также обратите внимание, что ваш вызов calloc фактически выделяет больше памяти, чем нужно, потому что calloc выполняет умножение внутри метода.

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