我正在使用以下函数使用 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);
}
}
如有任何建议,我们将不胜感激。
已更新
根据Frank Denis和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);
}
}
我是一名优秀的程序员,十分优秀!