PDA

View Full Version : [C] Aiuto librerie OpenSSL


Nagashi890
04-09-2014, 18:30
Ciao a tutti..
devo usare le librerie OpenSSL in C per proteggere la comunicazione tra un client e un server
utilizzando l'algoritmo RSA, ma il programma non funziona e non so più dove sbattere la testa..

questo è il codice del client che cripta una stringa con la funzione encryptString()


#include <openssl/rsa.h>
#include <openssl/rand.h>
#include <openssl/pem.h>
#include <openssl/evp.h>

int encryptString(char* string, char* dataout, char* filename, RSA* rsa) {

int size;
char file_pem_pub[36];
strcpy(file_pem_pub, filename);
FILE* fp;

fp = fopen(file_pem_pub, "r"); //file che contiene la chiave creata in precedenza

rsa = PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL);

RSA_public_encrypt(strlen(string), string, dataout, rsa, RSA_PKCS1_PADDING);

size = strlen(dataout);

fclose(fp);

return size;
}

int main() {

int rsa_size;
int ret;
char* dataout; //buffer che deve contenere il messaggio criptato
//char* message = <stringa da criptare>

OpenSSL_add_all_algorithms();
RSA* rsa = RSA_new();

rsa_size = RSA_size(rsa);

dataout = malloc(rsa_size);

memset(dataout, 0, sizeof(dataout));
ret = encryptString(message, dataout, "spub.pem", rsa);
RSA_free(rsa);
}

Il programma dà errore di segmentazione quando esegue la funzione RSA_size()
non so più che correzioni fare.. spero che qualcuno mi possa aiutare.

Grazie!

Nagashi890
06-09-2014, 11:43
Allora.. ho risolto l'errore di segmentazione togliendo la funzione encryptString e mettendo tutto nel main..

Ora però il problema è che il server non decripta, e la funzione RSA_private_decrypt() restituisce -1

riporto il codice del server e del client saltando tutto il codice relativo alla creazione dei socket.


//Client

generate_RSA_keys("cpub.pem", "cpriv.pem");

printf("Inserisci il tuo nome: ");
fflush(stdout);

scanf("%s", nome);

//RSA ALGORITHM

// Context allocation
OpenSSL_add_all_algorithms();
RSA* rsa = RSA_new();

//Encryption
FILE* fp;
fp = fopen("spub.pem", "r");

rsa = PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL);
rsa_size = RSA_size(rsa);

cnome = (char*)malloc(rsa_size);
memset(cnome, 0 , sizeof(cnome));

nlen = strlen(nome);
RSA_public_encrypt(nlen, nome, cnome, rsa, RSA_PKCS1_PADDING);

//Context deallocation
RSA_free(rsa);
fclose(fp);

int c_len = strlen(cnome);
ret = send(sk, (void*)cnome, c_len+1, 0);


//Server

generate_RSA_keys("spub.pem", "spriv.pem");

ret = recv(c_sk, (void*)cnome, sizeof(cnome), 0);

//RSA ALGORITHM
//Context allocation
OpenSSL_add_all_algorithms();
RSA* rsa = RSA_new();

FILE* fp;
fp = fopen("spriv.pem", "r");

//Decryption
rsa = PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL);

rsa_size = RSA_size(rsa);

nome = (char*)malloc(rsa_size);
memset(nome, 0, sizeof(nome));
c_len = strlen(cnome);
n = RSA_private_decrypt(rsa_size, cnome, nome, rsa, RSA_PKCS1_PADDING);

//Context deallocation
RSA_free(rsa);
fclose(fp);

Questa è la funzione generate_RSA_keys()

void generate_RSA_keys(char* public, char* private) {

char file_pem[strlen(private)];
char file_pem_pub[strlen(public)];
strcpy(file_pem, private);
strcpy(file_pem_pub, public);
FILE *fp;

int bits = 1024;
unsigned long exp = RSA_F4;
RSA *rsa;
rsa = RSA_generate_key(bits,exp,NULL,NULL);

fp = fopen(file_pem, "w");
unsigned char *kstr = "pass";
PEM_write_RSAPrivateKey(fp,rsa,EVP_des_ede3_cbc(),kstr,strlen(kstr),NULL,NULL);
fclose(fp);
fp = fopen(file_pem_pub, "w");
PEM_write_RSAPublicKey(fp, rsa);
fclose(fp);
RSA_free(rsa);

}

La stringa criptata viene ricevuta correttamente dal server.. ma poi non viene decriptata..
Ho visto però che a volte funziona, altre volte dà questo errore:

error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02