RESOLU: J'étais stupide. Le premier argument de encrypt aurait dû être key.size() et le premier argument de decrypt aurait dû être RSA_size (myKey). Hé les gars, j'ai du mal à trouver comment faire ça.SIMPLE OpenSSL RSA Encryption en C/C++ me cause des maux de tête
Fondamentalement, je veux juste un client et un serveur pour pouvoir envoyer les uns les autres messages cryptés.
Cela va être incroyablement incertain parce que j'essaie de comprendre tout cela, donc je pourrais aussi bien commencer au rez-de-chaussée. Jusqu'à présent, j'ai toutes les clés qui fonctionnent, mais le chiffrement/déchiffrement me donne l'enfer. Je commencerai par dire que j'utilise C++, mais la plupart de ces fonctions nécessitent des chaînes de caractères C, donc tout ce que je fais peut causer des problèmes.
Notez que du côté client, je reçois l'erreur suivante en ce qui concerne le décryptage.
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
Je ne comprends pas vraiment comment fonctionne padding donc je ne sais pas comment le résoudre.
Toute personne qui est ici les variables pertinentes de chaque côté suivi du code.
Client:
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);
}
Serveur:
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);
}
Permettez-moi encore une fois, au cas où je ne l'ai pas avant, que je connais mon code suce mais je suis juste essayer d'établir un cadre pour comprendre cela.
Je suis désolé si cela vous offense les anciens codeurs.
Merci d'avance pour toute aide que vous pouvez fournir!
Votre question était informative, mais si vous avez répondu à votre question, écrivez-la comme une réponse et notez-la comme résolue. – HighLife