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

标签 c++ c ssl openssl

我的 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/

相关文章:

c - C 中的链表

python - 如何强制 suds 仅使用 TLS?

.net - 如何为 ASP.NET 4 的某些文件夹禁用 ssl?

c++ - "while"和 "delete"的这种奇怪组合意味着什么?

c++ - 如何将命令行参数作为字符串传递给从 C++ 执行的嵌入式 Python 脚本?

C++ 编译时检查微 Controller 引脚是否已从其他源文件初始化

php - Telegram webhook 不传递任何数据(ssl 可以)

c++ - 重置条件变量(提升)

c++ - 如何将 C++ 或 C 中的字符串转换为整数数组?

c++ - C/C++ 套接字代理