Signatur
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
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;
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
// 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.