Start · Sprachen · PHP · Referenz · gnupg_decrypt

gnupg_decrypt

Funktion

Entschlüsselt einen mit GnuPG verschlüsselten Text mithilfe eines zuvor hinzugefügten privaten Schlüssels.

seit PHP 1.3.0 Kategorie: crypto

Signatur

gnupg_decrypt(resource $identifier, string $text): string|false

Beschreibung

gnupg_decrypt() entschlüsselt einen PGP/GPG-verschlüsselten String und gibt den Klartext zurück. Bevor diese Funktion aufgerufen wird, muss mit gnupg_adddecryptkey() mindestens ein privater Schlüssel (ggf. mit Passphrase) zur GnuPG-Ressource hinzugefügt worden sein.

Die Funktion arbeitet mit der GnuPG-PECL-Extension (pecl/gnupg) und setzt eine korrekt konfigurierte GPG-Umgebung voraus, d. h. ein gültiges Schlüsselbund-Verzeichnis mit dem privaten Schlüssel, dessen Fingerabdruck beim Hinzufügen angegeben wurde.

Typische Einsatzbereiche sind das Entschlüsseln sicher übertragener Nachrichten oder Dateien, z. B. verschlüsselte E-Mails, API-Antworten oder Konfigurationsdaten, die nur autorisierte Stellen lesen dürfen.

Im Fehlerfall – etwa wenn kein passender Schlüssel gefunden wird oder der Chiffretext beschädigt ist – gibt die Funktion false zurück. Mit gnupg_geterror() lässt sich dann die genaue Fehlerursache abfragen.

Parameter

Name Typ Default Beschreibung
$identifier Pflicht resource Eine GnuPG-Ressource, die zuvor mit gnupg_init() erstellt wurde.
$text Pflicht string Der zu entschlüsselnde PGP-verschlüsselte Text (ASCII-Armor-Format oder binär).

Rückgabewert

Typ
string|false
Beschreibung
Gibt den entschlüsselten Klartext als string zurück, oder false im Fehlerfall (z. B. kein passender Schlüssel, ungültiger Chiffretext).

Beispiele

Einfaches Entschlüsseln einer verschlüsselten Nachricht

<?php
// GnuPG-Ressource initialisieren
$gpg = gnupg_init();

// Privaten Schlüssel mit Fingerabdruck und Passphrase hinzufügen
$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
$passphrase  = 'meine_geheime_passphrase';

gnupg_adddecryptkey($gpg, $fingerprint, $passphrase);

// Verschlüsselter Text (ASCII-Armor)
$encrypted = '-----BEGIN PGP MESSAGE-----
...
-----END PGP MESSAGE-----';

$plaintext = gnupg_decrypt($gpg, $encrypted);

if ($plaintext === false) {
    echo 'Fehler beim Entschlüsseln: ' . gnupg_geterror($gpg);
} else {
    echo 'Entschlüsselter Text: ' . $plaintext;
}
Entschlüsselter Text: Hallo, das ist eine geheime Nachricht!

Entschlüsseln mit OO-Schnittstelle (gnupg-Klasse)

<?php
// OO-Schnittstelle der GnuPG-Extension verwenden
$gpg = new gnupg();

$fingerprint = 'ABCDEF1234567890ABCDEF1234567890ABCDEF12';
$gpg->adddecryptkey($fingerprint, 'meine_geheime_passphrase');

$encrypted = file_get_contents('/var/secure/message.gpg');

$plaintext = $gpg->decrypt($encrypted);

if ($plaintext === false) {
    throw new RuntimeException('Entschlüsselung fehlgeschlagen: ' . $gpg->geterror());
}

echo 'Inhalt: ' . $plaintext;

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Speichere Passphrasen niemals im Klartext im Quellcode. Nutze Umgebungsvariablen oder einen Secret-Manager.
  • Der private Schlüssel muss im GPG-Schlüsselbund des Systembenutzers vorhanden sein, unter dem PHP ausgeführt wird (z. B. www-data). Passe ggf. das GNUPGHOME-Verzeichnis per putenv('GNUPGHOME=/pfad/zum/keyring') an.
  • Stelle sicher, dass die GPG-Umgebung korrekte Dateiberechtigungen besitzt (Verzeichnis nur für den PHP-Benutzer lesbar), um unbefugten Zugriff auf private Schlüssel zu verhindern.
  • gnupg_decrypt() prüft nicht die Signatur des Textes. Für signierte und verschlüsselte Nachrichten sollte zusätzlich gnupg_decryptverify() verwendet werden.