Signatur
Beschreibung
openssl_public_encrypt() verwendet asymmetrische Kryptografie, um Daten mit einem öffentlichen Schlüssel zu verschlüsseln. Die verschlüsselten Daten können anschließend nur mit dem zugehörigen privaten Schlüssel (über openssl_private_decrypt()) wieder entschlüsselt werden. Dies ist das klassische Muster für eine Public-Key-Verschlüsselung.
Typische Anwendungsfälle sind das sichere Übertragen von symmetrischen Schlüsseln (Hybrid-Verschlüsselung), das Versenden vertraulicher Kurznachrichten an den Inhaber eines Zertifikats sowie die Sicherung von Daten in Datenbanken, die nur vom Schlüsselinhaber gelesen werden sollen. Die Funktion eignet sich nicht für große Datenmengen, da RSA nur Klartextblöcke verschlüsseln kann, die kleiner sind als die Schlüsselgröße (abzüglich Padding-Overhead).
Der Parameter $padding steuert das verwendete Padding-Verfahren. Der Standard OPENSSL_PKCS1_PADDING (PKCS#1 v1.5) ist weit verbreitet, jedoch ist OPENSSL_PKCS1_OAEP_PADDING (OAEP) für neue Anwendungen empfohlen, da es sicherer gegen bestimmte Angriffe ist. OPENSSL_NO_PADDING sollte nur in sehr speziellen, kontrollierten Szenarien eingesetzt werden.
Der öffentliche Schlüssel kann als PEM-String, als Pfad zu einer PEM-Datei (file://…), als OpenSSLAsymmetricKey-Ressource oder als Array übergeben werden. Zum Laden eines Zertifikats eignet sich openssl_get_publickey().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $data Pflicht | string | Der zu verschlüsselnde Klartext. Die maximale Länge hängt von der Schlüsselgröße und dem Padding-Verfahren ab (z. B. bei 2048-Bit-Schlüssel und PKCS#1-Padding maximal 245 Bytes). | |
| $encrypted_data Pflicht | string | Ausgabe-Parameter (als Referenz übergeben), in den die verschlüsselten Binärdaten geschrieben werden. Der vorherige Inhalt wird überschrieben. | |
| $public_key Pflicht | OpenSSLAsymmetricKey|OpenSSLCertificate|array|string | Der öffentliche Schlüssel. Kann ein OpenSSLAsymmetricKey-Objekt (aus openssl_get_publickey()), ein OpenSSLCertificate-Objekt, ein PEM-String oder ein Pfad der Form file:///pfad/zum/schlüssel.pem sein. |
|
| $padding | int | OPENSSL_PKCS1_PADDING | Das Padding-Verfahren. Mögliche Werte: OPENSSL_PKCS1_PADDING (Standard, PKCS#1 v1.5), OPENSSL_PKCS1_OAEP_PADDING (empfohlen für neue Implementierungen), OPENSSL_SSLV23_PADDING oder OPENSSL_NO_PADDING (unsicher, nur für spezielle Zwecke). |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. ungültiger Schlüssel, zu große Datenmenge oder falsches Padding). Fehlermeldungen können mit openssl_error_string() abgerufen werden.Beispiele
Einfache RSA-Verschlüsselung und -Entschlüsselung
<?php
// Schlüsselpaar erzeugen (nur für Demo — in der Praxis extern speichern)
$keyPair = openssl_pkey_new([
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);
// Öffentlichen Schlüssel extrahieren
$publicKeyDetails = openssl_pkey_get_details($keyPair);
$publicKeyPem = $publicKeyDetails['key'];
$plaintext = 'Geheime Nachricht';
$encryptedData = '';
// Mit öffentlichem Schlüssel verschlüsseln
if (openssl_public_encrypt($plaintext, $encryptedData, $publicKeyPem, OPENSSL_PKCS1_OAEP_PADDING)) {
echo 'Verschlüsselt (Base64): ' . base64_encode($encryptedData) . PHP_EOL;
} else {
echo 'Fehler: ' . openssl_error_string() . PHP_EOL;
exit(1);
}
// Mit privatem Schlüssel entschlüsseln
$decryptedData = '';
if (openssl_private_decrypt($encryptedData, $decryptedData, $keyPair, OPENSSL_PKCS1_OAEP_PADDING)) {
echo 'Entschlüsselt: ' . $decryptedData . PHP_EOL;
} else {
echo 'Entschlüsselung fehlgeschlagen: ' . openssl_error_string() . PHP_EOL;
}
Hybrid-Verschlüsselung: AES-Schlüssel mit RSA schützen
<?php
// Öffentlichen Schlüssel aus Zertifikatsdatei laden
$publicKey = openssl_get_publickey('file:///pfad/zum/empfaenger.crt');
if ($publicKey === false) {
die('Öffentlicher Schlüssel konnte nicht geladen werden: ' . openssl_error_string());
}
// Zufälligen AES-256-Schlüssel erzeugen
$aesKey = random_bytes(32); // 256 Bit
$aesIv = random_bytes(16); // 128 Bit IV
// Große Nutzdaten mit AES verschlüsseln
$payload = str_repeat('Vertrauliche Daten... ', 1000);
$encryptedPayload = openssl_encrypt($payload, 'aes-256-cbc', $aesKey, OPENSSL_RAW_DATA, $aesIv);
// Den AES-Schlüssel mit RSA (OAEP) verschlüsseln
$encryptedAesKey = '';
if (!openssl_public_encrypt($aesKey, $encryptedAesKey, $publicKey, OPENSSL_PKCS1_OAEP_PADDING)) {
die('RSA-Verschlüsselung des AES-Schlüssels fehlgeschlagen: ' . openssl_error_string());
}
// Paket zusammenstellen (z. B. für Übertragung oder Speicherung)
$package = [
'key' => base64_encode($encryptedAesKey),
'iv' => base64_encode($aesIv),
'data' => base64_encode($encryptedPayload),
];
echo 'Hybrid-Verschlüsselung erfolgreich.' . PHP_EOL;
echo 'Paketgröße: ' . strlen(json_encode($package)) . ' Bytes' . PHP_EOL;
// Wichtig · Fallstricke
Sicherheitshinweise:
- Verwende für neue Implementierungen immer
OPENSSL_PKCS1_OAEP_PADDINGstatt des veraltetenOPENSSL_PKCS1_PADDING(PKCS#1 v1.5), das anfällig für Bleichenbacher-Angriffe ist. OPENSSL_NO_PADDINGbietet keinerlei Schutz gegen Manipulationsangriffe und sollte in der Praxis niemals für allgemeine Zwecke verwendet werden.- Die direkte RSA-Verschlüsselung großer Datenmengen ist ein Anti-Pattern. Nutze stattdessen Hybrid-Verschlüsselung (AES für die Daten, RSA nur für den AES-Schlüssel).
- Die maximale Klartextgröße bei einem 2048-Bit-Schlüssel beträgt mit PKCS#1 v1.5 Padding 245 Bytes, mit OAEP-Padding (SHA-1) nur 214 Bytes.
- Die Ausgabe in
$encrypted_dataist binär — für die Übertragung oder Speicherung empfiehlt sich Base64-Kodierung viabase64_encode().