Criptografia em C++: da teoria à prática de criptografia e hash
A criptografia é a base fundamental da segurança de aplicações modernas. Em C++, o desenvolvedor tem acesso a bibliotecas poderosas que permitem implementar tanto criptografia simétrica/assimétrica quanto hash criptográfico. Neste material, abordaremos duas bibliotecas-chave: OpenSSL (padrão de facto) e Crypto++ (C++ puro, conveniente para integração). Você aprenderá como criptografar dados, verificar integridade e proteger senhas.
Conceitos criptográficos principais
Antes de passar ao código, é importante entender três operações básicas:
- Criptografia simétrica (AES, ChaCha20) — uma chave para criptografar e descriptografar. Rápida, adequada para grandes volumes de dados.
- Criptografia assimétrica (RSA, ECC) — par de chaves (pública/privada). Usada para troca de chaves e assinaturas digitais.
- Hash (SHA-256, MD5) — transformação irreversível de dados em uma string de comprimento fixo. Aplicada para verificação de integridade e armazenamento de senhas.
1. Trabalhando com OpenSSL em C++
OpenSSL é uma biblioteca multiplataforma em C, acessível via vinculação. Instalação: sudo apt install libssl-dev (Linux) ou via vcpkg/conan para Windows.
Exemplo: criptografia simétrica AES-256-CBC
#include <iostream>#include <string>#include <openssl/evp.h>#include <openssl/rand.h>
std::string 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::string ciphertext(plaintext.size() + 16, '\\0'); int len = 0, ciphertext_len = 0; EVP_EncryptUpdate(ctx, reinterpret_cast<unsigned char*>(&ciphertext[0]), &len, reinterpret_cast<const unsigned char*>(plaintext.data()), plaintext.size()); ciphertext_len = len; EVP_EncryptFinal_ex(ctx, reinterpret_cast<unsigned char*>(&ciphertext[ciphertext_len]), &len); ciphertext_len += len; ciphertext.resize(ciphertext_len); EVP_CIPHER_CTX_free(ctx); return ciphertext;}
int main() { unsigned char key[32], iv[16]; RAND_bytes(key, sizeof(key)); // Geração de chave aleatória RAND_bytes(iv, sizeof(iv));
std::string data = "Mensagem secreta"; std::string encrypted = aes_encrypt(data, key, iv); std::cout << "Criptografado: " << encrypted.size() << " bytes" << std::endl; return 0;}Hash SHA-256 via OpenSSL
#include <iostream>#include <openssl/sha.h>
std::string sha256(const std::string& str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.c_str(), str.size()); 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::cout << "SHA-256: " << sha256("Hello, Crypto!") << std::endl; return 0;}2. Biblioteca Crypto++ (implementação pura em C++)
Crypto++ (cryptopp) é uma biblioteca completa em C++ sem dependências externas. Instalação: sudo apt install libcrypto++-dev ou baixar de cryptopp.com.
Exemplo: criptografia RSA com Crypto++
#include <iostream>#include <string>#include <cryptopp/rsa.h>#include <cryptopp/osrng.h>#include <cryptopp/base64.h>
int main() { using namespace CryptoPP;
AutoSeededRandomPool rng; Inve Também na biblioteca
Envio de email em C++: libcurl e clientes SMTP
Trabalho com imagens em TypeScript: redimensionar e recortar com Sharp e Jimp
Cliente OAuth para C# (.NET): implementação de autorização através de serviços terceiros
Rate Limiting em Kotlin: bibliotecas e exemplos práticos