OpenSSL: RSA-Verschlüsselung/Entschlüsselung, Schlüssel-Generierung & key Persistenz

Ich versuche zu bauen, ein p2p-Anwendung, die erfordert, dass die folgende, mit RSA 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

Habe ich gewählt, um die Verwendung der GD-Funktionen, was bedeutet, dass. Aber ich bin mit höchsten Schwierigkeiten, welche Funktionen ich brauche, zu verwenden, um diese Dinge zu tun, und in welcher Reihenfolge. Offizielle Dokumentation von OpenSSL scheint nicht existent.

Weiß jemand, welche Funktionen ich brauche, zu verwenden, in welcher Reihenfolge und Ihre Prototypen? Beispielcode rumliegen wäre auch schön.

Vielen Dank im Voraus,

twitchliquid64.

PS: Dies ist, was ich bisher

#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;
}
  • Ehrlich, immer direkt Antworten zu dieser Frage ist viel mehr wahrscheinlich, tun Sie einen Bärendienst, als ein service. Der trick ist, die richtigen Rahmenbedingungen zur Erreichung Ihrer Sicherheitsziele, und bekommen all die "kleinen Stücke" Recht nicht in irgendeiner Weise sicherzustellen, dass das system als ganzes sicher ist. Sie werden viel besser dran, wenn Sie anfangen, indem Sie sagen, was Sie versuchen zu erreichen. (Zum Beispiel, wenn Sie senden Sie einen öffentlichen Schlüssel über einen sockel, was Stoppt einen Angreifer ersetzt, seinen eigenen öffentlichen Schlüssel und damit in der Lage, die Nachricht zu entschlüsseln und neu verschlüsseln Sie es mit dem richtigen Schlüssel?)
  • Dies ist vor allem ein proof-of-concept. Zweitens, ich habe Lösungen zu der oben genannten Probleme (man-in-the-middle-Angriff etc), das alles bleibt für mich zu tun, ist diese 'kleine Stückchen'.
  • Finden Sie die Beispiel-code, der kommt mit OpenSSL nützlicher als die Dokumentation. Zum Beispiel die Dokumentation der Verschlüsselung mit RSA ist, zeigt im apps/rsa.c. Es kann helfen, zu arbeiten, die OpenSSL-Befehlszeile führen Sie jede Funktion, die Sie wollen mit dem Befehlszeilen-tool, und dann herauszufinden, was der code tatsächlich tut (überprüfen Sie es), so können Sie Ihren code die gleiche Sache zu tun.
Schreibe einen Kommentar