ПРОСТОЕ OpenSSL RSA Шифрование в C / C ++ вызывает у меня головную боль - PullRequest
0 голосов
/ 06 мая 2010

решено: я тупой Первым аргументом шифрования должен был быть 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 Ответ

1 голос
/ 06 мая 2010

Возможно, не единственная проблема, но: первый аргумент RAS_xxxcrypt функций - это количество байтов буферов. sizeof(key.c_str()) не возвращает количество байтов в ключе, оно возвращает размер типа результата key.c_str(), т.е. sizeof(const char*). Возможно, вы вместо этого хотите передать число символов в строке, которое можно получить с помощью функции-члена size().

...