2012-05-28 4 views
6

Я пытаюсь создать приложение для p2p, которая требует следующего, используя RSA в OpenSSL:OpenSSL: RSA шифрование/дешифрование, генерация ключа и ключ настойчивость

-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: Это то, что я до сих пор

#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; 
} 
+3

Честно говоря, получение прямых ответов на этот вопрос гораздо более вероятно, окажет вам плохую услугу, чем услугу. Трюк имеет правильную структуру для достижения ваших целей безопасности, и получение всех «маленьких кусочков» правильно делает * не * каким-либо образом гарантируют безопасность системы в целом. Вам будет намного лучше, если вы начнете, сказав, что вы пытаетесь выполнить. (Например, если вы отправляете открытый ключ через сокет, что помешает злоумышленнику заменить его собственный открытый ключ и, таким образом, сможет расшифровать сообщение и заново зашифровать его с помощью правильного ключа?) –

+0

Это в основном доказательство концепция. Во-вторых, у меня есть решения для вышеупомянутых проблем (нападение «человек-в-середине» и т. Д.), Все, что мне остается делать, это «маленькие биты». –

+0

Вы найдете пример кода, который поставляется с OpenSSL более полезным, чем документация. Например, документация по шифрованию с RSA отображается в 'apps/rsa.c'. Это может помочь разработать командные строки OpenSSL для выполнения каждой функции, которую вы хотите использовать с помощью средства командной строки, а затем выяснить, что на самом деле делает код (путем проверки его), чтобы вы могли сделать код аналогичным. –

ответ

6

Как сказал в комментарии на мой вопрос:

Вы найдете пример кода, который поставляется с OpenSSL более полезным, чем документации. Например, документация по шифрованию с RSA отображается в приложениях/rsa.c. Это может помочь разработать командные строки OpenSSL для выполнения каждой функции, которую вы хотите использовать с помощью средства командной строки, а затем выяснить, что на самом деле делает код (путем проверки его), чтобы вы могли сделать код аналогичным. - Дэвид Шварц

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

+1

у вас есть ссылка? – chacham15

+0

http://www.opensource.apple.com/source/OpenSSL097/OpenSSL097-16/openssl/apps/rsa.c – osyan

Смежные вопросы