Kryptografie in C++: Verschlüsselung und Hashing – vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kryptografie in C++: Verschlüsselung und Hashing – vollständiger Leitfaden



Kryptografie ist die grundlegende Basis für die Sicherheit moderner Anwendungen. In C++ stehen Entwicklern leistungsstarke Bibliotheken zur Verfügung, um Verschlüsselung, Entschlüsselung und Hashing von Daten zu implementieren. In diesem Artikel betrachten wir zwei beliebte Bibliotheken im Detail: OpenSSL und Crypto++, und erläutern die wichtigsten Konzepte: symmetrische Verschlüsselung (AES), asymmetrische Verschlüsselung (RSA) und kryptografische Hash-Funktionen (SHA-256).



1. Grundlegende Begriffe der Kryptografie



Bevor wir zum Code übergehen, ist es wichtig, die grundlegenden Begriffe zu verstehen:

  • Symmetrische Verschlüsselung – Ein Schlüssel wird sowohl für die Verschlüsselung als auch für die Entschlüsselung verwendet. Beispiele: AES, DES, ChaCha20.
  • Asymmetrische Verschlüsselung – Ein Schlüsselpaar: ein öffentlicher (zum Verschlüsseln) und ein privater (zum Entschlüsseln). Beispiele: RSA, ECC.
  • Hash-Funktionen – Nicht umkehrbare Umwandlung von Daten in eine Zeichenkette fester Länge. Beispiele: SHA-256, MD5 (veraltet), BLAKE2.
  • Salt – Zufällige Daten, die dem Passwort vor dem Hashing hinzugefügt werden, um es vor Regenbogentabellen zu schützen.


2. Die OpenSSL-Bibliothek in C++



OpenSSL ist eine plattformübergreifende Open-Source-Bibliothek, die die Protokolle SSL/TLS und eine breite Palette kryptografischer Algorithmen implementiert. Für die Arbeit mit ihr in C++ müssen die Header-Dateien eingebunden und die Bibliotheken libssl und libcrypto gelinkt werden.



Beispiel 1: SHA-256-Hashing mit 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 - Kryptografie in C++"; std::cout << "SHA-256: " << sha256(data) << std::endl; return 0;}


Dieser Code demonstriert die grundlegende Verwendung des SHA256-Kontexts. Die Funktion SHA256_Init initialisiert den Kontext, SHA256_Update fügt Daten hinzu (kann für die Streaming-Verarbeitung mehrfach aufgerufen werden) und SHA256_Final schließt die Berechnung ab und schreibt das Ergebnis.



Beispiel 2: Symmetrische AES-256-CBC-Verschlüsselung



#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() { // 256-Bit-Schlüssel (32 Bytes) und 128-Bit-IV (16 Bytes) unsigned char key[32] = "01234567890123456789012345678901"; unsigned char iv[16] = "0123456789012345";

std::string message = "Geheime Daten für PythonLib"

Empfehlungen