gpt4 book ai didi

c - libsodium crypto_box_seal_open 失败

转载 作者:太空宇宙 更新时间:2023-11-04 07:52:45 25 4
gpt4 key购买 nike

我正在使用以下函数使用 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 DenisDamV的建议,我修改了之前的加解密函数如下;请注意从 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);

}
}

最佳答案

sizeof <pointer>返回一个常量,即指针本身的大小。

在您的代码中 sizeof(msg)将始终返回 4 或 8,无论消息大小如何。

sizeof(msg->enc_body)可能也不会按照您的意愿行事。

如果您是 C 语言的新手,我建议您忘记 sizeof关键词。

您很少需要它,它是该语言的新手编写的应用程序中的混淆、错误和漏洞的主要来源。

您唯一需要记住的是 sizeof (<type>)sizeof value总是返回一个常量。

关于c - libsodium crypto_box_seal_open 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52740857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com