Start · Sprachen · PHP · Referenz · gnupg_encryptsign

gnupg_encryptsign

Funktion

Verschlüsselt und signiert einen gegebenen Klartext in einem einzigen Schritt mit den zuvor konfigurierten GnuPG-Schlüsseln.

seit PHP 1.3.0 Kategorie: crypto

Signatur

gnupg_encryptsign(resource $identifier, string $plaintext): string|false

Beschreibung

gnupg_encryptsign() kombiniert die Verschlüsselung und das Signieren eines Textes in einem einzigen Vorgang. Damit kann der Sender sicherstellen, dass die Nachricht sowohl vertraulich (verschlüsselt) als auch authentisch (signiert) ist. Bevor diese Funktion aufgerufen werden kann, müssen über gnupg_addencryptkey() mindestens ein Empfänger-Schlüssel sowie über gnupg_addsignkey() mindestens ein Signatur-Schlüssel hinzugefügt worden sein.

Das Ergebnis ist eine kombinierte OpenPGP-Nachricht, die sowohl die Verschlüsselung als auch die digitale Signatur enthält. Der Empfänger kann mit seinem privaten Schlüssel entschlüsseln und anschließend die Signatur des Absenders verifizieren, um die Integrität und Herkunft der Nachricht zu bestätigen.

Diese Funktion eignet sich besonders für sichere E-Mail-Kommunikation, das Übertragen vertraulicher Daten oder den Austausch von Dokumenten, bei denen sowohl Geheimhaltung als auch Nachweisbarkeit der Urheberschaft gewünscht sind.

Das Signierverhalten (z. B. detached vs. clearsign) wird über gnupg_setsignmode() gesteuert. Der Standardmodus ist GNUPG_SIG_MODE_NORMAL. Für verschlüsselte Nachrichten empfiehlt sich üblicherweise GNUPG_SIG_MODE_DETACH.

Parameter

Name Typ Default Beschreibung
$identifier Pflicht resource Die GnuPG-Ressource, die zuvor mit gnupg_init() erstellt wurde und die Konfiguration der Schlüssel enthält.
$plaintext Pflicht string Der Klartext, der verschlüsselt und signiert werden soll. Kann beliebige Binär- oder Textdaten enthalten.

Rückgabewert

Typ
string|false
Beschreibung
Gibt im Erfolgsfall den verschlüsselten und signierten Text als string zurück. Bei einem Fehler (z. B. kein Schlüssel gesetzt oder ungültiger Schlüssel) wird false zurückgegeben. Mit gnupg_geterror() lässt sich der genaue Fehler ermitteln.

Beispiele

Einfaches Verschlüsseln und Signieren einer Nachricht

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

// Empfänger-Schlüssel hinzufügen (Fingerprint des Empfängers)
$recipientFingerprint = 'ABCD1234ABCD1234ABCD1234ABCD1234ABCD1234';
gnupg_addencryptkey($gpg, $recipientFingerprint);

// Signatur-Schlüssel hinzufügen (Fingerprint des Absenders, ggf. mit Passphrase)
$senderFingerprint = 'EFGH5678EFGH5678EFGH5678EFGH5678EFGH5678';
gnupg_addsignkey($gpg, $senderFingerprint, 'meine_passphrase');

// Nachricht verschlüsseln und signieren
$plaintext = 'Das ist eine vertrauliche und authentische Nachricht.';
$encrypted = gnupg_encryptsign($gpg, $plaintext);

if ($encrypted === false) {
    echo 'Fehler: ' . gnupg_geterror($gpg);
} else {
    echo 'Verschlüsselte und signierte Nachricht:' . PHP_EOL;
    echo $encrypted;
}
Verschlüsselte und signierte Nachricht: -----BEGIN PGP MESSAGE----- ... -----END PGP MESSAGE-----

Verschlüsseln und Signieren mit explizitem Signaturmodus

<?php
$gpg = gnupg_init();

// Signaturmodus auf DETACH setzen (empfohlen für verschlüsselte Nachrichten)
gnupg_setsignmode($gpg, GNUPG_SIG_MODE_DETACH);

// Armored-Ausgabe aktivieren (ASCII-Ausgabe statt Binär)
gnupg_setarmor($gpg, 1);

$recipientFingerprint = 'ABCD1234ABCD1234ABCD1234ABCD1234ABCD1234';
gnupg_addencryptkey($gpg, $recipientFingerprint);

$senderFingerprint = 'EFGH5678EFGH5678EFGH5678EFGH5678EFGH5678';
gnupg_addsignkey($gpg, $senderFingerprint, 'meine_passphrase');

$nachricht = 'Vertrauliche Projektdaten für den Empfänger.';
$result = gnupg_encryptsign($gpg, $nachricht);

if ($result !== false) {
    // Ergebnis z. B. in eine Datei schreiben oder per E-Mail versenden
    file_put_contents('/tmp/nachricht.gpg', $result);
    echo 'Datei erfolgreich geschrieben.';
} else {
    echo 'Fehler beim Verschlüsseln/Signieren: ' . gnupg_geterror($gpg);
}
Datei erfolgreich geschrieben.

// Wichtig · Fallstricke

Schlüsselverwaltung: Sowohl Empfänger- als auch Signaturschlüssel müssen im lokalen GnuPG-Schlüsselbund vorhanden und gültig (nicht abgelaufen, nicht widerrufen) sein. Fehlt ein Schlüssel oder ist er ungültig, gibt die Funktion false zurück.

Passphrase-Sicherheit: Die Passphrase des Signaturschlüssels wird im PHP-Code als Klartext übergeben. Achte darauf, diese nicht in Versionskontrollsystemen zu speichern. Verwende stattdessen Umgebungsvariablen oder sichere Secret-Management-Lösungen.

Armored vs. Binär: Standardmäßig gibt gnupg_encryptsign() binäre Daten zurück. Für die Übertragung per E-Mail oder in Textformaten sollte gnupg_setarmor($gpg, 1) vorher aufgerufen werden, um ASCII-Armor-Ausgabe zu aktivieren.

Fehlerbehandlung: Überprüfe den Rückgabewert stets auf false und nutze gnupg_geterror(), um aussagekräftige Fehlermeldungen zu erhalten, ohne diese jedoch dem Endbenutzer preiszugeben.