gpt4 book ai didi

c++ - SSL签名验证跨语言问题

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

我的 C websocket 服务器应用程序中有以下代码。该代码使用给定的公钥对消息执行 ssl 签名验证。该代码在 C 应用程序中运行良好,但最近我开始在 C++ 上编写它。我遇到的问题是相同的代码,即下面,在两个应用程序中都没有变化,两次接收相同的输入数据,但是一个用 C++ 编译产生 SSL 错误错误签名。

代码如下:

int verifyMessageSignature(const char* decoded_message, int pos,
unsigned char* signature, char* publicKey)
{
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
// OpenSSL_add_all_algorithms()

if (!publicKey)
{
printf("publicKey is null\n");
}
BIO* keyBio = BIO_new_mem_buf(publicKey, -1);
if(!keyBio)
{
printf("failed to created BIO\n");
printError(ERR_get_error());
}

BIO_set_mem_eof_return(keyBio, 0);

RSA* rsa = PEM_read_bio_RSA_PUBKEY(keyBio, NULL, NULL, NULL);

if (!rsa)
{
printf("Error in PEM_read_bio_RSA_PUBKEY\n");
printError(ERR_get_error());
}

EVP_MD_CTX *mdctx = NULL;
if (!(mdctx = EVP_MD_CTX_create()))
{
printf("Error in ctx\n");
printError(ERR_get_error());
}

EVP_PKEY* pk = EVP_PKEY_new();

if (EVP_PKEY_set1_RSA(pk, rsa) != 1)
{
printf("err in EVP_PKEY_set1_RSA\n");
printError(ERR_get_error());
}

if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha1(), NULL, pk) != 1)
{
printf("error in EVP_DigestVerifyInit\n");
printError(ERR_get_error());
}

if (EVP_DigestVerifyUpdate(mdctx, decoded_message, pos) != 1)
{
printf("error in EVP_DigestVerifyUpdate\n");
printError(ERR_get_error());
}

if (EVP_DigestVerifyFinal(mdctx, signature, 512) == 1)
{
/* Success */
printf("Successful verification!\n");
}
else
{
/* Failure */
printf("Unsuccessful verification!\n");
printError(ERR_get_error());
BIO_free_all(keyBio);
RSA_free(rsa);
EVP_PKEY_free(pk);
EVP_MD_CTX_destroy(mdctx);
ERR_free_strings();
return 1;
}

BIO_free_all(keyBio);
RSA_free(rsa);
EVP_PKEY_free(pk);
EVP_MD_CTX_destroy(mdctx);
ERR_free_strings();

return 0;

此代码在 C 中运行良好。它在我的测试中成功验证了签名,而在 C++ 中具有相同输入数据( key 、消息等)的相同代码会产生错误的签名。

我在 Ubuntu 下编译,使用 gcc 和 g++(最新)

可能导致此问题的原因是什么?

最佳答案

已解决。问题是我正在使用 std::string 来传递解码后的消息,这不知何故搞砸了。我将 C++ 代码切换为在本节中也使用 char* 字符串,现在没问题了。

感谢您的回复,希望对其他人有用。

编辑:PS:我正在使用另一个函数来生成解码消息本身。 std::string 的使用导致了这个问题。

关于c++ - SSL签名验证跨语言问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26796625/

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