Cómo utilizar la biblioteca OpenSSL para cifrado y descifrado RSA
#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.