C / C ++中简单的OpenSSL RSA加密让我感到头疼

时间:2010-05-06 00:18:04

标签: c++ network-programming openssl rsa

解决:我愚蠢。加密的第一个参数应该是key.size(),而解密的第一个参数应该是RSA_size(myKey)。

嘿伙计们,我在弄清楚如何做到这一点时遇到了一些麻烦。

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

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

到目前为止,我已经将所有密钥都工作了,但加密/解密让我很难过。

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

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

error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed

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

这里的任何一个都是相关变量,后面是代码。

客户端:

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);
        }

让我再次声明,如果我之前没有,我知道我的代码很糟糕,但我只是想建立一个理解这个的框架。

如果这冒犯了你的老练程序员,我很抱歉。

提前感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:1)

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