Start · Sprachen · PHP · Referenz · gnupg_adddecryptkey

gnupg_adddecryptkey

Funktion

Fügt einem GnuPG-Ressource-Handle einen privaten Schlüssel hinzu, der für die Entschlüsselung von Nachrichten verwendet werden soll.

seit PHP 1.3.0 Kategorie: crypto

Signatur

gnupg_adddecryptkey(resource $identifier, string $fingerprint, string $passphrase): bool

Beschreibung

gnupg_adddecryptkey registriert einen privaten GPG-Schlüssel anhand seines Fingerabdrucks und der zugehörigen Passphrase an einer GnuPG-Ressource. Der Schlüssel wird anschließend bei Aufrufen von gnupg_decrypt automatisch verwendet, um verschlüsselte Nachrichten zu entschlüsseln.

Die Funktion setzt voraus, dass der Schlüssel bereits im GnuPG-Schlüsselbund (Keyring) des Systems vorhanden ist. Über den Fingerabdruck wird der Schlüssel eindeutig identifiziert – bei Mehrdeutigkeit ist daher stets der vollständige 40-stellige Fingerabdruck zu bevorzugen.

Es können mehrere Entschlüsselungsschlüssel gleichzeitig registriert werden, indem gnupg_adddecryptkey mehrfach aufgerufen wird. GnuPG versucht dann beim Entschlüsseln jeden registrierten Schlüssel, bis einer passt. Mit gnupg_cleardecryptkeys lassen sich alle registrierten Schlüssel wieder entfernen.

Die Funktion gehört zur prozeduralen Schnittstelle der GnuPG-Erweiterung. Die objektorientierte Alternative ist gnupg::adddecryptkey().

Parameter

Name Typ Default Beschreibung
$identifier Pflicht resource Eine GnuPG-Ressource, die zuvor mit gnupg_init() erstellt wurde.
$fingerprint Pflicht string Der Fingerabdruck des privaten Schlüssels (idealerweise vollständige 40-stellige Hex-Zeichenkette ohne Leerzeichen), der für die Entschlüsselung genutzt werden soll.
$passphrase Pflicht string Die Passphrase des privaten Schlüssels. Bei Schlüsseln ohne Passphrase kann ein leerer String '' übergeben werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Schlüssel erfolgreich registriert wurde. Gibt false zurück, wenn der Fingerabdruck nicht gefunden wurde, die Passphrase falsch ist oder ein anderer Fehler aufgetreten ist. Über gnupg_geterror lässt sich die genaue Fehlermeldung abrufen.

Beispiele

Nachricht mit registriertem Schlüssel entschlüsseln

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

$fingerprint = 'A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2';
$passphrase  = 'meine_geheime_passphrase';

// Entschlüsselungsschlüssel registrieren
if (!gnupg_adddecryptkey($gpg, $fingerprint, $passphrase)) {
    $error = gnupg_geterror($gpg);
    die('Fehler beim Hinzufügen des Schlüssels: ' . $error);
}

// Verschlüsselte Nachricht (PGP-Armored)
$encryptedMessage = '-----BEGIN PGP MESSAGE-----
...
-----END PGP MESSAGE-----';

// Nachricht entschlüsseln
$plaintext = gnupg_decrypt($gpg, $encryptedMessage);

if ($plaintext === false) {
    die('Entschlüsselung fehlgeschlagen: ' . gnupg_geterror($gpg));
}

echo 'Entschlüsselte Nachricht: ' . $plaintext;
Entschlüsselte Nachricht: Hallo Welt!

Mehrere Entschlüsselungsschlüssel registrieren

<?php
$gpg = gnupg_init();

$keys = [
    ['fingerprint' => 'AABBCCDDEEFF00112233445566778899AABBCCDD', 'passphrase' => 'pass1'],
    ['fingerprint' => '1122334455667788990AABBCCDDEEFF00112233', 'passphrase' => 'pass2'],
];

foreach ($keys as $key) {
    if (!gnupg_adddecryptkey($gpg, $key['fingerprint'], $key['passphrase'])) {
        echo 'Konnte Schlüssel ' . $key['fingerprint'] . ' nicht hinzufügen: ' . gnupg_geterror($gpg) . PHP_EOL;
    } else {
        echo 'Schlüssel ' . $key['fingerprint'] . ' erfolgreich registriert.' . PHP_EOL;
    }
}

// Jetzt kann gnupg_decrypt() mit beiden Schlüsseln entschlüsseln
Schlüssel AABBCCDDEEFF00112233445566778899AABBCCDD erfolgreich registriert. Schlüssel 1122334455667788990AABBCCDDEEFF00112233 erfolgreich registriert.

// Wichtig · Fallstricke

Sicherheitshinweis: Die Passphrase sollte niemals im Klartext im Quellcode stehen. Verwende stattdessen Umgebungsvariablen (getenv()) oder sichere Konfigurationsdateien außerhalb des Web-Roots, um Passphrasen zu verwalten.

Der Schlüssel muss sich bereits im GnuPG-Schlüsselbund des Benutzers befinden, unter dem der PHP-Prozess läuft (z. B. www-data). Andernfalls schlägt gnupg_adddecryptkey fehl. Achte auf den richtigen GNUPGHOME-Pfad, der über gnupg_init(['homedir' => '/pfad/zum/keyring']) gesetzt werden kann.

Die Funktion steht nur zur Verfügung, wenn die PECL-Erweiterung gnupg installiert und in php.ini aktiviert ist. Prüfe mit extension_loaded('gnupg'), ob die Erweiterung verfügbar ist.