assert($cipher !== $plain, 'Verschlüsselter Wert unterscheidet sich vom Klartext'); $this->assert(str_starts_with($cipher, 'enc:v1:'), 'Verschlüsselter Wert hat Magic-Prefix enc:v1:'); $this->assertEquals($plain, Crypto::decrypt($cipher), 'Entschlüsselung liefert Originaltext'); // 2. Leerer String $this->assertEquals('', Crypto::encrypt(''), 'Leerer Eingabewert wird leer zurückgegeben (encrypt)'); $this->assertEquals('', Crypto::decrypt(''), 'Leerer Eingabewert wird leer zurückgegeben (decrypt)'); // 3. Idempotenz: bereits verschlüsselt → unverändert $cipher2 = Crypto::encrypt($cipher); $this->assertEquals($cipher, $cipher2, 'encrypt() auf bereits verschlüsselten Wert ist idempotent'); // 4. Migration: Klartext-Wert ohne Prefix → unverändert durch decrypt() $this->assertEquals('roher-text', Crypto::decrypt('roher-text'), 'decrypt() reicht Klartext (ohne Prefix) unverändert durch'); // 5. Zwei Verschlüsselungen desselben Klartextes ergeben verschiedene Cipher (zufälliges IV) $a = Crypto::encrypt('hallo'); $b = Crypto::encrypt('hallo'); $this->assert($a !== $b, 'Zwei encrypt()-Aufrufe ergeben verschiedene Cipher (IV ist zufällig)'); $this->assertEquals('hallo', Crypto::decrypt($a), 'Cipher A entschlüsselt korrekt'); $this->assertEquals('hallo', Crypto::decrypt($b), 'Cipher B entschlüsselt korrekt'); // 6. Falscher Key → Exception $_ENV['APP_KEY'] = str_repeat('b2', 32); Config::load(); $threw = false; try { Crypto::decrypt($cipher); } catch (\RuntimeException) { $threw = true; } $this->assert($threw, 'decrypt() mit falschem Schlüssel wirft RuntimeException'); // 7. isEncrypted-Helper $_ENV['APP_KEY'] = str_repeat('a1', 32); Config::load(); $this->assert(Crypto::isEncrypted($cipher), 'isEncrypted erkennt verschlüsselten Wert'); $this->assert(!Crypto::isEncrypted('plain'), 'isEncrypted erkennt Klartext nicht als verschlüsselt'); $this->assert(!Crypto::isEncrypted(''), 'isEncrypted ist false für leeren String'); } finally { // Original-Key wiederherstellen if ($oldKey === null) { unset($_ENV['APP_KEY']); } else { $_ENV['APP_KEY'] = $oldKey; } Config::load(); } } }