feat: RsaEncryptionService — asymmetrische RSA-OAEP Verschlüsselung #5

Open
opened 2026-07-26 19:20:23 +02:00 by claudeCode · 0 comments
Member

Motivation

Für Anwendungsfälle wie verschlüsselte API-Secrets oder Client-Credentials, bei denen der Empfänger (Server) der einzige ist, der entschlüsseln darf, ist asymmetrische RSA-Verschlüsselung das richtige Werkzeug. OAEP-Padding ist der aktuelle Standard (PKCS#1 v1.5 ist unsicher).

API

$keyPair = RsaKeyPair::generate(bits: 4096);

// Nur Public Key beim Sender:
$encService = RsaEncryptionService::fromPublicKey($keyPair->getPublicKeyPem());
$ciphertext = $encService->encrypt('client-secret-value');

// Private Key nur beim Empfänger:
$decService = RsaEncryptionService::fromPrivateKey($keyPair->getPrivateKeyPem());
$plaintext  = $decService->decrypt($ciphertext);

RsaKeyPair

$keyPair = RsaKeyPair::generate(bits: 4096);          // 2048 oder 4096
$keyPair->getPublicKeyPem(): string
$keyPair->getPrivateKeyPem(): string
RsaKeyPair::fromPem(public: $pub, private: $priv): self

Implementierungsdetails

  • openssl_public_encrypt() / openssl_private_decrypt() mit OPENSSL_PKCS1_OAEP_PADDING
  • RsaKeyPair::generate() nutzt openssl_pkey_new() mit ['private_key_bits' => $bits]
  • Nur 2048 und 4096 Bit erlaubt (Enum oder Konstante)
  • Output: base64-kodiert (konsistent mit AesEncryptionService)
  • Namespace: Tez\Utils\Crypto\Asymmetric\Rsa

Aufgaben

  • src/Asymmetric/Rsa/RsaKeyPair.php implementieren
  • src/Asymmetric/Rsa/RsaEncryptionService.php implementieren
  • Unit-Tests in tests/Asymmetric/Rsa/RsaEncryptionServiceTest.php
    • Key-Generierung (2048 + 4096 Bit)
    • Encrypt/Decrypt Roundtrip
    • Decrypt mit falschem Private Key schlägt fehl
    • PEM-Laden und Wiederverwenden
  • README-Abschnitt
  • PHPStan-Level beibehalten

Abhängigkeiten

  • Blockiert von #1 (Namespace-Reorganisation)
  • Setzt #7 (PemKeyLoader) voraus oder wird parallel entwickelt
## Motivation Für Anwendungsfälle wie verschlüsselte API-Secrets oder Client-Credentials, bei denen der Empfänger (Server) der einzige ist, der entschlüsseln darf, ist asymmetrische RSA-Verschlüsselung das richtige Werkzeug. OAEP-Padding ist der aktuelle Standard (PKCS#1 v1.5 ist unsicher). ## API ```php $keyPair = RsaKeyPair::generate(bits: 4096); // Nur Public Key beim Sender: $encService = RsaEncryptionService::fromPublicKey($keyPair->getPublicKeyPem()); $ciphertext = $encService->encrypt('client-secret-value'); // Private Key nur beim Empfänger: $decService = RsaEncryptionService::fromPrivateKey($keyPair->getPrivateKeyPem()); $plaintext = $decService->decrypt($ciphertext); ``` ## RsaKeyPair ```php $keyPair = RsaKeyPair::generate(bits: 4096); // 2048 oder 4096 $keyPair->getPublicKeyPem(): string $keyPair->getPrivateKeyPem(): string RsaKeyPair::fromPem(public: $pub, private: $priv): self ``` ## Implementierungsdetails - `openssl_public_encrypt()` / `openssl_private_decrypt()` mit `OPENSSL_PKCS1_OAEP_PADDING` - `RsaKeyPair::generate()` nutzt `openssl_pkey_new()` mit `['private_key_bits' => $bits]` - Nur 2048 und 4096 Bit erlaubt (Enum oder Konstante) - Output: base64-kodiert (konsistent mit `AesEncryptionService`) - Namespace: `Tez\Utils\Crypto\Asymmetric\Rsa` ## Aufgaben - [ ] `src/Asymmetric/Rsa/RsaKeyPair.php` implementieren - [ ] `src/Asymmetric/Rsa/RsaEncryptionService.php` implementieren - [ ] Unit-Tests in `tests/Asymmetric/Rsa/RsaEncryptionServiceTest.php` - Key-Generierung (2048 + 4096 Bit) - Encrypt/Decrypt Roundtrip - Decrypt mit falschem Private Key schlägt fehl - PEM-Laden und Wiederverwenden - [ ] README-Abschnitt - [ ] PHPStan-Level beibehalten ## Abhängigkeiten - Blockiert von #1 (Namespace-Reorganisation) - Setzt #7 (PemKeyLoader) voraus oder wird parallel entwickelt
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: tez/tez-utils-crypto#5