Criptografía en C++: cifrado y hash — guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en C++: cifrado y hash — guía completa



La criptografía es la base fundamental de la seguridad de las aplicaciones modernas. En C++, los desarrolladores tienen acceso a potentes bibliotecas que permiten implementar cifrado, descifrado y hash de datos. En este artículo, analizaremos en detalle dos bibliotecas populares: OpenSSL y Crypto++, y también abordaremos conceptos clave: cifrado simétrico (AES), cifrado asimétrico (RSA) y funciones hash criptográficas (SHA-256).



1. Conceptos básicos de criptografía



Antes de pasar al código, es importante comprender los términos básicos:

  • Cifrado simétrico — se utiliza una sola clave tanto para cifrar como para descifrar. Ejemplos: AES, DES, ChaCha20.
  • Cifrado asimétrico — un par de claves: pública (para cifrar) y privada (para descifrar). Ejemplos: RSA, ECC.
  • Funciones hash — transformación irreversible de datos en una cadena de longitud fija. Ejemplos: SHA-256, MD5 (obsoleto), BLAKE2.
  • Sal (salt) — datos aleatorios añadidos a la contraseña antes del hash para proteger contra tablas rainbow.


2. Biblioteca OpenSSL en C++



OpenSSL es una biblioteca multiplataforma de código abierto que implementa los protocolos SSL/TLS y un amplio conjunto de algoritmos criptográficos. Para trabajar con ella en C++, es necesario incluir los archivos de encabezado y enlazar con las bibliotecas libssl y libcrypto.



Ejemplo 1: Hash SHA-256 con OpenSSL



#include <iostream>#include <openssl/sha.h>#include <cstring>

std::string sha256(const std::string& input) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, input.c_str(), input.length()); SHA256_Final(hash, &sha256);

std::string output; for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) { char buf[3]; sprintf(buf, "%02x", hash[i]); output += buf; } return output;}

int main() { std::string data = "PythonLib - criptografía en C++"; std::cout << "SHA-256: " << sha256(data) << std::endl; return 0;}


Este código demuestra el uso básico del contexto SHA256. La función SHA256_Init inicializa el contexto, SHA256_Update añade datos (se puede llamar varias veces para procesamiento en flujo) y SHA256_Final completa el cálculo y escribe el resultado.



Ejemplo 2: Cifrado simétrico AES-256-CBC



#include <iostream>#include <openssl/evp.h>#include <vector>#include <cstring>

std::vector<unsigned char> aes_encrypt(const std::string& plaintext, const unsigned char* key, const unsigned char* iv) { EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key, iv);

std::vector<unsigned char> ciphertext(plaintext.size() + EVP_CIPHER_block_size(EVP_aes_256_cbc())); int len = 0; int ciphertext_len = 0;

EVP_EncryptUpdate(ctx, ciphertext.data(), &len, reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.size()); ciphertext_len = len;

EVP_EncryptFinal_ex(ctx, ciphertext.data() + len, &len); ciphertext_len += len; ciphertext.resize(ciphertext_len);

EVP_CIPHER_CTX_free(ctx); return ciphertext;}

int main() { // Clave de 256 bits (32 bytes) e IV de 128 bits (16 bytes) unsigned char key[32] = "01234567890123456789012345678901"; unsigned char iv[16] = "0123456789012345";

std::string message = "Datos secretos para PythonLib";

Recommendations