OpenSSL: RSA de Chiffrement/Déchiffrement, la génération de clés & l'essentiel de la persistance

Je suis en train de construire une application p2p qui requiert les éléments suivants, à l'aide de RSA dans OpenSSL:

-Encryption
-Decryption
-Generating Keys (done)
-Saving and loading keys (done)
-Saving the PUBLIC key as bytes so it can be sent over the sockets
-Loading keys from the above format

J'ai choisi d'utiliser la DG fonctions, quoi que cela signifie. Cependant, je vais avoir suprême de la difficulté à trouver les fonctions dont j'ai besoin pour faire ces choses, et dans quel ordre. La documentation officielle de OpenSSL semble être inexistant.

Personne ne sait ce qu'fonctions dont j'ai besoin pour utiliser dans quel ordre et à leurs prototypes? Un exemple de code qui traînent serait bien aussi.

Merci beaucoup à l'avance,

twitchliquid64.

PS: c'est Ce que j'ai jusqu'à présent

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/engine.h>
#include <openssl/rand.h>

RSA* Generate_KeyPair(void)
{
  char rand_buff[16];
  EVP_PKEY *pkey = NULL;
  RSA* r;
  char* pass = "passgdfgf";//for now

  int bits = 512;       //     512, 1024, 2048, 4096
  unsigned long exp = RSA_F4;     //     RSA_3
  OpenSSL_add_all_algorithms();

  RAND_seed(rand_buff, 16); //On linux: RAND_load_file("/dev/urandom", 1024);
  r = RSA_generate_key(bits,exp,NULL,NULL);

  if (RSA_check_key(r)!=1);;; //Check key - error out

  //Create EVP to save to file.
  pkey = EVP_PKEY_new();
  EVP_PKEY_assign_RSA(pkey, r);

  //Save private key
  FILE* fp = fopen("private.key", "w");
  PEM_write_PrivateKey(fp,pkey,EVP_aes_256_cbc(),NULL,0,NULL,pass)
  fclose(fp);

  //Save public key
  fp = fopen("public.key", "w");
  PEM_write_PUBKEY(fp, pkey);
  fclose(fp);

  return r;
}

EVP_PKEY* ReadPrivKey_FromFile(char* filename, char* pass)
{
  FILE* fp = fopen(filename, "r");
  EVP_PKEY* key = NULL;
  PEM_read_PrivateKey(fp, &key, NULL, pass);
  fclose(fp);

  return key;
}

EVP_PKEY* ReadPubKey_FromFile(char* filename)
{
  FILE* fp = fopen(filename, "r");
  EVP_PKEY* key = NULL;
  PEM_read_PUBKEY(fp, &key, NULL, NULL);
  fclose(fp);

  return key;
}
Honnêtement, obtenir directement des réponses à cette question est beaucoup plus susceptibles de vous faire une mauvais que d'un service. L'astuce est d'avoir le bon cadre de travail pour atteindre vos objectifs en matière de sécurité, et d'obtenir tous les "petits morceaux" de droit sur la pas en aucune façon de s'assurer que l'ensemble du système est sécurisé. Vous serez beaucoup mieux si vous commencez par dire que ce que vous essayez d'accomplir. (Par exemple, si vous envoyez une clé publique sur un socket, ce qui empêche un attaquant de substituer sa propre clé publique, et donc d'être en mesure de déchiffrer le message et re-chiffrer avec la clé correcte?)
C'est surtout une preuve de concept. Deuxièmement, j'ai des solutions à la date précitée, les problèmes (man-in-the-middle attack, etc), tout ce qui me reste à faire est de ces "petits morceaux".
Vous trouverez le code d'exemple fourni avec OpenSSL plus utile que de la documentation. Par exemple, la documentation de chiffrement RSA est présente dans apps/rsa.c. Il peut aider à travailler sur la commande OpenSSL lignes à effectuer chaque fonction que vous voulez faire avec l'outil de ligne de commande et ensuite de voir ce que le code fait réellement (en l'inspectant) de sorte que vous pouvez faire de votre code faire la même chose.

OriginalL'auteur 64bit_twitchyliquid | 2012-05-28