OpenSSL: шифрование / дешифрование RSA, генерация ключей и сохранение ключей

Я пытаюсь создать приложение p2p, которое требует следующего, используя 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

Я решил использовать функции EVP, что бы это ни значило. Однако я испытываю огромные трудности с поиском того, какие функции мне нужно использовать для выполнения этих задач и в каком порядке. Официальная документация OpenSSL, похоже, не существует.

Кто-нибудь знает, какие функции мне нужно использовать, в каком порядке и их прототипы? Любой пример кода лежал бы также хорошо.

Большое спасибо заранее,

twitchliquid64.

PS: This is what I have so far

#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;
}
 David Schwartz29 мая 2012 г., 02:30
Вы найдете пример кода, который поставляется с OpenSSL, более полезным, чем документация. Например, документация по шифрованию с RSA показана вapps/rsa.c, Это может помочь в разработке командных строк OpenSSL для выполнения каждой функции, которую вы хотите сделать с помощью инструмента командной строки, а затем выяснить, что на самом деле делает код (проверяя его), чтобы вы могли заставить свой код делать то же самое.
 David Schwartz28 мая 2012 г., 05:41
Честно говоря, получение прямых ответов на этот вопрос, скорее всего, окажет вам медвежью услугу, чем услугу. Хитрость заключается в том, чтобы создать правильную основу для достижения целей безопасности и получить все «маленькие кусочки». правильно делаетnot в любом случае убедитесь, что система в целом безопасна. Вам будет гораздо лучше, если вы начнете с того, что скажете, чего вы пытаетесь достичь. (Например, если вы отправляете открытый ключ через сокет, что мешает злоумышленнику подставить свой собственный открытый ключ и таким образом иметь возможность расшифровать сообщение и повторно зашифровать его с правильным ключом?)
 64bit_twitchyliquid29 мая 2012 г., 01:49
Это в основном доказательство концепции. Во-вторых, у меня есть решения вышеупомянутых проблем (атака «человек посередине» и т. Д.), Все, что мне остается сделать, - это «маленькие кусочки».

Ответы на вопрос(1)

Решение Вопроса

You'll find the example code that comes with OpenSSL more useful than the documentation. For example, documentation of encryption with RSA is shows in apps/rsa.c. It may help to work out the OpenSSL command lines to perform each function you want to do with the command line tool and then figure out what the code actually does (by inspecting it) so you can make your code do the same thing. & # X2013; Дэвид Шварц

Этот пример кода был именно тем, что мне было нужно, я советую всем, кто сталкивался с подобной проблемой, обратиться к коду и файлу заголовка rsa, а также к их небольшим примерам в документации.

 29 апр. 2013 г., 01:24
У вас есть ссылка?
 13 апр. 2014 г., 14:31

Ваш ответ на вопрос