|
|
|
|
Strumenti |
04-09-2014, 18:30 | #1 |
Junior Member
Iscritto dal: Nov 2010
Messaggi: 11
|
[C] Aiuto librerie OpenSSL
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() Codice:
#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); } non so più che correzioni fare.. spero che qualcuno mi possa aiutare. Grazie! |
06-09-2014, 11:43 | #2 |
Junior Member
Iscritto dal: Nov 2010
Messaggi: 11
|
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. Codice:
//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); Codice:
//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); Codice:
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); } Ho visto però che a volte funziona, altre volte dà questo errore: Codice:
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02 Ultima modifica di Nagashi890 : 06-09-2014 alle 11:51. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:06.