Шифрование с использованием 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 выполняет умножение внутри метода.