Red de conocimiento informático - Material del sitio web - Cómo utilizar la biblioteca OpenSSL para cifrado y descifrado RSA

Cómo utilizar la biblioteca OpenSSL para cifrado y descifrado RSA

#include

#include

#include

#include

#include

int?main(int?argc,char*?argv[])

{

printf("openssl_test?begin/n");

RSA*?rsa=NULL;

char?originstr[]="hola\n";// estos son los datos originales que necesitamos cifrar

//allocate?RSA?estructura, primero debe solicitar una estructura RSA para almacenar las claves públicas y privadas generadas, aquí rsa es un puntero a esta estructura

rsa?=?RSA_new();

if(rsa==NULL)

{ printf("RSA_new?failed\n");? ?;

}

//Generar clave RSA

BIGNUM*?exponent;

exponent?=?BN_new(); /Antes de generar claves públicas/privadas RSA, debe elegir un número impar (número impar) para generar claves públicas y privadas

if(exponent?==NULL)

{

printf("BN_new?failed/n"); ?

ir a?FAIL1;

}

if(0 ==BN_set_word (exponent,65537))//Aquí elige el número impar 65537

{printf("BN_set_word?failed\n");?geto?FAIL1;

}

// La longitud del módulo seleccionado aquí es 4096. Cualquier longitud de módulo inferior a 1024 no es segura y es fácil de descifrar

if(0==RSA_generate_key_ex(rsa,4096,exponent,NULL) )?

{

printf("RSA_generate_key_ex?failed\n");?

ir a?FAIL;?

}

char*?cipherstr?=?NULL;

//Asigne un espacio para almacenar los datos cifrados, cuyo tamaño se calcula mediante la función RSA_size basada en rsa

cipherstr?=?malloc(RSA_size(rsa));?? El tipo de relleno del parámetro se puede utilizar de la siguiente manera.

/*

RSA_PKCS1_PADDINGPKCS #1.5 relleno. Este es actualmente el modo más utilizado.

Este modo es el más utilizado actualmente.

RSA_SSLV23_PADDING

PKCS #1.5 agrega modificaciones específicas de SSL para indicar que el servidor es compatible con SSL3.

RSA_NO_PADDING

Cifrado RSA sin formato. No es seguro utilizar RSA directamente para cifrar los datos del usuario.

*/? // Utilice la clave pública para el primer cifrado aquí y seleccione RSA_PKCS1_PADDING if(RSA_size(rsa)!=RSA_public_encrypt(strlen(originstr)+1,originstr,cipherstr,rsa,RSA_PKCS1_PADDING) )

{

printf("encriptación?failure\n");

ir a?FAIL2;

}

printf("la?cadena?original?es?%s\n",originstr);

printf("¿la?cadena?encriptada?es?%s\n" ,cipherstr);

/Ahora, ¿vamos a descifrar? Primero, se necesita un búfer para almacenar los datos descifrados. La longitud del búfer debe ser suficiente (menor que la longitud de RSA_ size(rsa))<. /p>

//Aquí se asigna una matriz de 250 caracteres, lo que debería ser suficiente.

char?decrypted_str[250];

int?decrypted_len;

if(-1=(decrypted_len=RSA_private_decrypt(256,cipherstr,decrypted_ str,rsa ,RSA_PKCS1_PADDING)))

{

printf("decryption?failure\n");

goto?FAIL2;

}

printf("decrypted? string?length?is?%d,decrypted_str?is?%s\n",decrypted_len,decrypted_str);

FAIL2: free(cipherstr);

FALLO1:

BN_ libre(exponente);

FALLO:

RSA_libre(rsa);

return?;

}

Lo anterior es el código fuente. Utilice el siguiente comando de compilación para generar un archivo ejecutable en la ruta del código fuente.

gcc *. c -o openssl _test -lcrypto -ldl -L/usr/local/ssl/lib -I/usr/local/ssl/include

Donde se deben usar -lcrypto y -ldl, el primero es cifrado en la biblioteca de algoritmos OpenSSL, que se utiliza para cargar correctamente bibliotecas dinámicas.