2010-05-06 2 views
0

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!

+0

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

Répondre

1

Peut-être pas le seul problème mais: Le premier argument à RAS_xxxcrypt fonctions est le nombre d'octets des tampons. sizeof(key.c_str()) ne donne pas le nombre d'octets dans la clé, il donne la taille du type de résultat du type key.c_str(), c'est-à-dire sizeof(const char*). Vous voulez probablement passer le nombre de caractères dans la chaîne à la place, ce qui peut être obtenu avec la fonction membre size().

+0

Des conneries qui m'a aidé même si j'ai toujours des problèmes. – Josh

Questions connexes