Я использую следующую функцию для создания запечатанного ящика с использованием libsodium:
void encrypt_message(char *msg, char *enc_msg, int db_id)
{
unsigned char pk[crypto_box_PUBLICKEYBYTES] = { '\0' };
char key[BUFLEN] = { '\0' };
db_man_get_contacts_public_key(db_id, key);
sodium_hex2bin(pk, crypto_box_publickeybytes(), key, sizeof(key),
NULL, NULL, NULL);
crypto_box_seal(enc_msg, msg, sizeof(msg), pk);
}
После чего я преобразую двоичное зашифрованное сообщение в шестнадцатеричное, для хранения на диске, используя следующую функцию libsodium
sodium_bin2hex(hex_cipher_text, sizeof(hex_cipher_text),
cipher_text, sizeof(cipher_text));
hex_cipher_text затем сохраняется в базе данных SQLite3.Когда я получаю сообщение для расшифровки, происходит сбой вызова libsodium с кодом ошибки 1 .Моя функция расшифровки выглядит следующим образом:
void decrypt_message(message *msg)
{
unsigned char pk[crypto_box_SECRETKEYBYTES] = { '\0' };
unsigned char pubkey[crypto_box_PUBLICKEYBYTES] = { '\0' };
char key[BUFLEN] = { '\0' };
unsigned char tmp[BUFLEN] = { '\0' };
int dbg = 0;
db_man_get_my_private_key(key);
sodium_hex2bin(pk, crypto_box_secretkeybytes(), key, sizeof(key), NULL, NULL, NULL);
memset(key, '\0', BUFLEN);
db_man_get_my_public_key(key);
sodium_hex2bin(pubkey, crypto_box_publickeybytes(), key, sizeof(key),
NULL, NULL, NULL);
sodium_hex2bin(tmp, sizeof(tmp), msg->enc_body, sizeof(msg- >enc_body),
NULL, NULL, NULL);
if ((dbg = crypto_box_seal_open(msg->dec_body, tmp, sizeof(tmp), pubkey, pk) != 0))
{
fprintf(stderr, "Decryption failed!\nError code: %d\n\n", dbg);
}
}
Любой совет будет принят с благодарностью.
Обновлен
По совету ФранкДенис и DamV Я изменил предыдущие функции шифрования и дешифрования следующим образом;обратите внимание на изменение вызова функции sizeof () на соответствующий вызов функции strlen () .
void encrypt_message(char *msg, char *enc_msg, int db_id)
{
unsigned char pk[crypto_box_PUBLICKEYBYTES] = { '\0' };
char key[BUFLEN] = { '\0' };
db_man_get_contacts_public_key(db_id, key);
sodium_hex2bin(pk, crypto_box_publickeybytes(), key, strlen(key),
NULL, NULL, NULL);
crypto_box_seal(enc_msg, msg, USR_MSG_MAX_LENGTH, pk);
}
void decrypt_message(message *msg)
{
unsigned char pk[crypto_box_SECRETKEYBYTES] = { '\0' };
unsigned char pubkey[crypto_box_PUBLICKEYBYTES] = { '\0' };
char key[BUFLEN] = { '\0' };
unsigned char tmp[BUFLEN] = { '\0' };
int dbg = 0;
db_man_get_my_private_key(key);
sodium_hex2bin(pk, crypto_box_secretkeybytes(), key, strlen(key),
NULL, NULL, NULL);
memset(key, '\0', BUFLEN);
db_man_get_my_public_key(key);
sodium_hex2bin(pubkey, crypto_box_publickeybytes(), key,
strlen(key), NULL, NULL, NULL);
sodium_hex2bin(tmp, sizeof(tmp), msg->enc_body, strlen(msg->enc_body),
NULL, NULL, NULL);
if ((dbg = crypto_box_seal_open(msg->dec_body, tmp,
USR_MSG_MAX_LENGTH + crypto_box_SEALBYTES, pubkey, pk) != 0))
{
fprintf(stderr, "Decryption failed!\nError code: %d\n\n", dbg);
}
}