gpt4 book ai didi

c++ - C/C++ 中的简单 OpenSSL RSA 加密让我头疼

转载 作者:行者123 更新时间:2023-11-28 08:29:34 24 4
gpt4 key购买 nike

已解决:我当时很蠢。 encrypt 的第一个参数应该是 key.size(),decrypt 的第一个参数应该是 RSA_size(myKey)。

原始问题大家好,我在弄清楚如何执行此操作时遇到了一些问题。

基本上我只希望客户端和服务器能够相互发送加密消息。

这将是非常不安全的,因为我正试图弄清楚这一切,所以我不妨从底层开始。

到目前为止,我的所有 key 都可以正常工作,但加密/解密让我很头疼。

首先我会说我正在使用 C++,但这些函数中的大多数都需要 C 字符串,所以无论我做什么都可能会导致问题。

请注意,在客户端,我收到有关解密的以下错误。

错误:04065072:rsa 例程:RSA_EAY_PRIVATE_DECRYPT:填充检查失败

我真的不明白填充是如何工作的,所以我不知道如何修复它。

这里是每一边的相关变量,后面是代码。

客户:

RSA *myKey; // Loaded with private key
// The below will hold the decrypted message
unsigned char* decrypted = (unsigned char*) malloc(RSA_size(myKey));
/* The below holds the encrypted string received over the network.
Originally held in a C-string but C strings never work for me and scare me
so I put it in a C++ string */
string encrypted;

// The reinterpret_cast line was to get rid of an error message.
// Maybe the cause of one of my problems?
if(RSA_private_decrypt(sizeof(encrypted.c_str()), reinterpret_cast<const unsigned char*>(encrypted.c_str()), decrypted, myKey, RSA_PKCS1_OAEP_PADDING)==-1)
{
cout << "Private decryption failed" << endl;
ERR_error_string(ERR_peek_last_error(), errBuf);
printf("Error: %s\n", errBuf);
free(decrypted);
exit(1);
}

服务器:

RSA *pkey; // Holds the client's public key
string key; // Holds a session key I want to encrypt and send
//The below will hold the encrypted message
unsigned char *encrypted = (unsigned char*)malloc(RSA_size(pkey));

// The reinterpret_cast line was to get rid of an error message.
// Maybe the cause of one of my problems?
if(RSA_public_encrypt(sizeof(key.c_str()), reinterpret_cast<const unsigned char*>(key.c_str()), encrypted, pkey, RSA_PKCS1_OAEP_PADDING)==-1)
{
cout << "Public encryption failed" << endl;
ERR_error_string(ERR_peek_last_error(), errBuf);
printf("Error: %s\n", errBuf);
free(encrypted);
exit(1);
}

让我再次声明,我知道我的代码很糟糕,但我只是想建立一个框架来理解这一点。

如果这冒犯了你们这些资深程序员,我很抱歉。

在此先感谢你们提供的任何帮助!

最佳答案

也许不是唯一的问题但是: RAS_xxxcrypt 函数的第一个参数是缓冲区的字节数。 sizeof(key.c_str()) 不产生 key 中的字节数,它产生 key.c_str() 的结果类型的类型的大小,即 sizeof(const char*)。您可能希望改为传递字符串中的字符数,这可以通过 size() 成员函数获得。

关于c++ - C/C++ 中的简单 OpenSSL RSA 加密让我头疼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2777630/

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