|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#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! |
|
|
|
|
|
#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 12:51. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:29.



















