Start · Sprachen · PHP · Referenz · rnp_op_encrypt

rnp_op_encrypt

Funktion

Verschlüsselt eine Nachricht mit OpenPGP unter Verwendung der angegebenen Schlüssel und Optionen über die RNP-Bibliothek.

seit PHP 8.0.0 Kategorie: crypto

Signatur

rnp_op_encrypt(RnpFFI $ffi, RnpInput $input, RnpOutput $output, array $keys, array $options = []): bool

Beschreibung

rnp_op_encrypt ist Teil der PHP-Bindings für die RNP OpenPGP-Bibliothek und ermöglicht es, Daten aus einem RnpInput-Objekt zu verschlüsseln und das Ergebnis in ein RnpOutput-Objekt zu schreiben. Die Verschlüsselung erfolgt nach dem OpenPGP-Standard (RFC 4880).

Die Funktion akzeptiert einen oder mehrere Empfänger-Schlüssel (als Array von RnpKey-Objekten), sodass die verschlüsselte Nachricht von mehreren Empfängern entschlüsselt werden kann. Optional können Passwortschutz, Komprimierung, Algorithmuswahl und weitere Parameter über das $options-Array gesteuert werden.

Typische Anwendungsfälle sind das Verschlüsseln von Dateien oder Nachrichten für bestimmte Empfänger, etwa in sicheren Kommunikationsanwendungen, Datei-Archivierungslösungen oder E-Mail-Verschlüsselung. Die Funktion ist sinnvoll, wenn eine standardkonforme, interoperable OpenPGP-Verschlüsselung benötigt wird.

Vor der Nutzung muss ein RnpFFI-Kontext erstellt und die benötigten öffentlichen Schlüssel der Empfänger geladen werden. Input und Output werden über dedizierte RnpInput- bzw. RnpOutput-Objekte übergeben.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht RnpFFI Ein initialisierter RNP-FFI-Kontext, erstellt z. B. mit rnp_ffi_create(). Enthält den Schlüsselring und die Konfiguration der Bibliothek.
$input Pflicht RnpInput Ein RnpInput-Objekt, das die zu verschlüsselnden Quelldaten enthält. Kann aus einer Datei, einem String oder einem Stream erstellt worden sein.
$output Pflicht RnpOutput Ein RnpOutput-Objekt, in das die verschlüsselten Daten geschrieben werden. Kann auf eine Datei, einen String-Puffer oder einen Stream verweisen.
$keys Pflicht array Array von RnpKey-Objekten, die die öffentlichen Schlüssel der Empfänger repräsentieren. Mindestens ein Schlüssel muss angegeben werden.
$options array [] Optionales assoziatives Array zur Steuerung von Verschlüsselungsparametern. Mögliche Schlüssel sind z. B. cipher (Algorithmus, z. B. 'AES256'), compression_alg, compression_level, armor (ASCII-Armor, bool), aead (AEAD-Modus) sowie Passwort-Optionen.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei erfolgreicher Verschlüsselung zurück, false bei einem Fehler (z. B. ungültiger Schlüssel, nicht initialisierter Kontext oder fehlgeschlagene Ausgabe).

Beispiele

Einfache Verschlüsselung einer Nachricht für einen Empfänger

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

// Öffentlichen Schlüssel des Empfängers laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/pfad/zum/pubkey.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

// Schlüssel des Empfängers suchen
$key = rnp_locate_key($ffi, 'userid', 'empfaenger@beispiel.de');

// Eingabe und Ausgabe vorbereiten
$input = rnp_input_from_memory('Geheime Nachricht');
$output = rnp_output_to_memory();

// Verschlüsseln
$result = rnp_op_encrypt($ffi, $input, $output, [$key], [
    'cipher'    => 'AES256',
    'armor'     => true,
    'compression_alg'   => 'ZIP',
    'compression_level' => 6,
]);

if ($result) {
    $encrypted = rnp_output_memory_get_buf($output);
    echo "Verschlüsselte Nachricht (ASCII-Armor):\n";
    echo $encrypted;
} else {
    echo "Fehler bei der Verschlüsselung.";
}

rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
Verschlüsselte Nachricht (ASCII-Armor): -----BEGIN PGP MESSAGE----- ... -----END PGP MESSAGE-----

Verschlüsselung für mehrere Empfänger mit Datei-Ausgabe

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

// Schlüsselring mit mehreren öffentlichen Schlüsseln laden
rnp_load_keys($ffi, 'GPG', file_get_contents('/pfad/zum/pubkeyring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

// Mehrere Empfänger-Schlüssel ermitteln
$key1 = rnp_locate_key($ffi, 'userid', 'alice@beispiel.de');
$key2 = rnp_locate_key($ffi, 'userid', 'bob@beispiel.de');

// Quelldatei und Ausgabedatei
$input  = rnp_input_from_path('/pfad/zur/geheimen_datei.txt');
$output = rnp_output_to_path('/pfad/zur/verschluesselt.pgp');

// Verschlüsselung für beide Empfänger
$success = rnp_op_encrypt($ffi, $input, $output, [$key1, $key2], [
    'cipher' => 'AES256',
    'armor'  => false,
]);

echo $success ? "Datei erfolgreich verschlüsselt." : "Verschlüsselung fehlgeschlagen.";

rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
Datei erfolgreich verschlüsselt.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Verwende stets aktuelle, vertrauenswürdige öffentliche Schlüssel der Empfänger. Ein veralteter oder kompromittierter Schlüssel untergräbt die Sicherheit der Verschlüsselung vollständig.
  • Bevorzuge starke Algorithmen wie AES256. Veraltete Algorithmen wie 3DES oder CAST5 sollten vermieden werden.
  • Der armor-Modus (ASCII-Armor) ist für Textkanäle sinnvoll (z. B. E-Mail), erhöht aber die Datenmenge um etwa 33 %. Für binäre Kanäle kann er deaktiviert werden.
  • Die Funktion gehört zur PECL-Extension rnp und ist nicht Teil der PHP-Standarddistribution. Sie muss separat installiert werden (pecl install rnp).
  • Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück; detailliertere Fehlermeldungen können über rnp_last_error() bzw. rnp_last_error_str() abgerufen werden.