Start · Sprachen · PHP · Referenz · rnp_key_export

rnp_key_export

Funktion

Exportiert einen OpenPGP-Schlüssel aus dem RNP-Schlüsselbund als Binär- oder ASCII-Armor-Daten.

seit PHP 8.0.0 Kategorie: crypto

Signatur

rnp_key_export(RnpFFI $ffi, string $key_id, int $flags): string|false

Beschreibung

rnp_key_export ist Teil der PHP-RNP-Erweiterung (rnp), die OpenPGP-Kryptographie über die librnp-Bibliothek bereitstellt. Die Funktion erlaubt es, einen Schlüssel anhand seiner ID oder seines Fingerabdrucks aus dem internen Schlüsselbund zu exportieren – wahlweise als binäres OpenPGP-Paket oder als ASCII-Armor-String.

Typische Anwendungsfälle sind das Speichern von Schlüsseln in Dateien, das Übertragen an andere Systeme oder das Einbetten in Nachrichten. Über den Parameter flags lässt sich steuern, ob der öffentliche Schlüssel, der private Schlüssel oder beides exportiert werden soll und ob die Ausgabe Base64-kodiert (ASCII-Armor) erfolgen soll.

Die verfügbaren Flags umfassen unter anderem:

  • RNP_KEY_EXPORT_PUBLIC – exportiert den öffentlichen Teil des Schlüssels.
  • RNP_KEY_EXPORT_SECRET – exportiert den privaten/geheimen Teil des Schlüssels.
  • RNP_KEY_EXPORT_ARMORED – erzeugt eine ASCII-Armor-Ausgabe anstelle von rohen Binärdaten.
  • RNP_KEY_EXPORT_SUBKEYS – schließt alle Unterschlüssel (Subkeys) in den Export ein.

Der Export privater Schlüssel sollte mit äußerster Sorgfalt behandelt werden. Die exportierten Daten sollten niemals unverschlüsselt übertragen oder gespeichert werden.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht RnpFFI Eine gültige RNP-FFI-Instanz, die zuvor mit rnp_ffi_create() erstellt und mit Schlüsseln befüllt wurde.
$key_id Pflicht string Die hexadezimale Schlüssel-ID oder der Fingerabdruck des zu exportierenden Schlüssels (z. B. '1A2B3C4D5E6F7890').
$flags Pflicht int Bitmaske aus RNP_KEY_EXPORT_*-Konstanten, die bestimmt, welcher Teil des Schlüssels exportiert wird und in welchem Format (binär oder ASCII-Armor).

Rückgabewert

Typ
string|false
Beschreibung
Gibt die exportierten Schlüsseldaten als String zurück – entweder als Binärdaten oder als ASCII-Armor-Text, abhängig von den flags. Gibt false zurück, wenn der Schlüssel nicht gefunden wurde oder ein Fehler aufgetreten ist.

Beispiele

Öffentlichen Schlüssel als ASCII-Armor exportieren

<?php
// RNP-FFI-Instanz erstellen
$ffi = rnp_ffi_create('GPG', 'GPG');

// Schlüssel aus einer Datei laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/pfad/zum/pubring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

// Öffentlichen Schlüssel als ASCII-Armor exportieren
$keyId = '1A2B3C4D5E6F7890';
$flags = RNP_KEY_EXPORT_PUBLIC | RNP_KEY_EXPORT_ARMORED | RNP_KEY_EXPORT_SUBKEYS;

$exportedKey = rnp_key_export($ffi, $keyId, $flags);

if ($exportedKey === false) {
    echo "Fehler: Schlüssel konnte nicht exportiert werden.\n";
} else {
    echo "Exportierter öffentlicher Schlüssel:\n";
    echo $exportedKey;
    // z. B. in Datei speichern
    file_put_contents('/pfad/zum/export_pub.asc', $exportedKey);
}

rnp_ffi_destroy($ffi);
Exportierter öffentlicher Schlüssel: -----BEGIN PGP PUBLIC KEY BLOCK----- ...(Base64-kodierte Schlüsseldaten)... -----END PGP PUBLIC KEY BLOCK-----

Privaten Schlüssel als Binärdaten exportieren und verschlüsselt speichern

<?php
$ffi = rnp_ffi_create('GPG', 'GPG');

// Privaten Schlüsselring laden
rnp_load_keys(
    $ffi,
    'GPG',
    file_get_contents('/pfad/zum/secring.gpg'),
    RNP_LOAD_SAVE_SECRET_KEYS
);

$keyId = 'ABCDEF1234567890';
$flags = RNP_KEY_EXPORT_SECRET | RNP_KEY_EXPORT_SUBKEYS;

$secretKeyData = rnp_key_export($ffi, $keyId, $flags);

if ($secretKeyData === false) {
    die("Fehler beim Exportieren des privaten Schlüssels.\n");
}

// WICHTIG: Private Schlüssel niemals im Klartext speichern!
// Hier: verschlüsselt ablegen (z. B. mit sodium_crypto_secretbox)
$encryptionKey = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$encrypted = sodium_crypto_secretbox($secretKeyData, $nonce, $encryptionKey);

file_put_contents('/sicherer/pfad/secret_key.enc', $nonce . $encrypted);
echo "Privater Schlüssel sicher gespeichert.\n";

rnp_ffi_destroy($ffi);
Privater Schlüssel sicher gespeichert.

// Wichtig · Fallstricke

Sicherheitshinweis: Der Export privater Schlüssel (RNP_KEY_EXPORT_SECRET) ist eine hochsensible Operation. Exportierte private Schlüsseldaten dürfen niemals unverschlüsselt auf Datenträgern gespeichert, über unsichere Kanäle übertragen oder in Logs geschrieben werden. Stellen Sie sicher, dass nur autorisierte Prozesse Zugriff auf diese Daten erhalten.

Verfügbarkeit: Die Funktion ist nur verfügbar, wenn die PHP-RNP-Erweiterung (php-rnp) installiert und aktiviert ist. Prüfen Sie die Verfügbarkeit mit extension_loaded('rnp'). Die genaue Signatur und der Funktionsname können je nach Erweiterungsversion leicht abweichen.

Flags kombinieren: Die RNP_KEY_EXPORT_*-Konstanten werden per bitweisem ODER (|) kombiniert. Das gleichzeitige Angeben von RNP_KEY_EXPORT_PUBLIC und RNP_KEY_EXPORT_SECRET kann je nach Implementierung zu einem Fehler führen – exportieren Sie public und private Schlüssel in separaten Aufrufen.