Criptografia em C++: criptografia e hash — guia completo
Criptografia é a base fundamental da segurança em aplicações modernas. Em C++, os desenvolvedores têm acesso a bibliotecas poderosas que permitem implementar criptografia, descriptografia e hash de dados. Neste artigo, abordaremos detalhadamente duas bibliotecas populares: OpenSSL e Crypto++, além de explorar conceitos-chave: criptografia simétrica (AES), criptografia assimétrica (RSA) e funções hash criptográficas (SHA-256).
1. Conceitos básicos de criptografia
Antes de passar ao código, é importante entender os termos básicos:
- Criptografia simétrica — uma única chave é usada tanto para criptografar quanto para descriptografar. Exemplos: AES, DES, ChaCha20.
- Criptografia assimétrica — par de chaves: pública (para criptografar) e privada (para descriptografar). Exemplos: RSA, ECC.
- Funções hash — transformação irreversível de dados em uma string de comprimento fixo. Exemplos: SHA-256, MD5 (obsoleto), BLAKE2.
- Salt — dados aleatórios adicionados à senha antes do hash para proteção contra rainbow tables.
2. Biblioteca OpenSSL em C++
OpenSSL é uma biblioteca multiplataforma de código aberto que implementa os protocolos SSL/TLS e um amplo conjunto de algoritmos criptográficos. Para trabalhar com ela em C++, é necessário incluir os arquivos de cabeçalho e fazer a ligação com as bibliotecas libssl e libcrypto.
Exemplo 1: Hash SHA-256 com 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 - criptografia em C++"; std::cout << "SHA-256: " << sha256(data) << std::endl; return 0;}Este código demonstra o uso básico do contexto SHA256. A função SHA256_Init inicializa o contexto, SHA256_Update adiciona dados (pode ser chamada várias vezes para processamento em fluxo), e SHA256_Final finaliza o cálculo e grava o resultado.
Exemplo 2: Criptografia simétrica 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() { // Chave 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 = "Dados secretos para PythonLib"; Também na biblioteca
Event Bus e o padrão Observer em JavaScript (Node.js) — criação de sistemas de eventos flexíveis
Mongoose Paginate para JavaScript (Node.js): guia completo com exemplos
ORM para Kotlin: comparação e exemplos (Exposed, Ktorm, Hibernate)
Configuração de aplicações Kotlin: bibliotecas e abordagens