ChaCha20-Poly1305 Example


<?php
declare(strict_types=1);

require_once __DIR__ . '/vendor/autoload.php';

use SafeCrypt\Protocole\ChaCha20;
use SafeCrypt\Protocole\ChaCha20Key;
use SafeCrypt\Protocole\ChaCha20Load;
use SafeCrypt\Protocole\ChaCha20Save;
use SafeCrypt\Exceptions\CryptoException;

$keyDir = __DIR__ . '/keys';
$keyFileName = 'chacha20_key.pem';
$keyPath = $keyDir . DIRECTORY_SEPARATOR . $keyFileName;

if (!file_exists($keyDir)){
    mkdir($keyDir, 0700, true);
}

try{
    if (file_exists($keyPath)){
        $keyLoader = new ChaCha20Load();
        $key = $keyLoader->load_key($keyFileName, $keyDir);
    }else{
        $keyGen = new ChaCha20Key();
        $key = $keyGen->generated(32);

        $keySaver = new ChaCha20Save();
        $keySaver->save_key($key, $keyFileName, $keyDir);
    }

    $chacha = new ChaCha20($key);

}catch (CryptoException $e){
    exit("Crypto error during setup: " . $e->getMessage() . PHP_EOL);
}catch (\Exception $e){
    exit("General error during setup: " . $e->getMessage() . PHP_EOL);
}

echo "Setup ChaCha20 ready\n";

// ----------- Encrypt/Decrypt -----------
$message = "My secret message for ChaCha20-Poly1305.";
$aad = "userID:123,timestamp:" . time();

$encrypted = $chacha->encrypt($message, $aad);
$decrypted = $chacha->decrypt($encrypted, $aad);

echo "\n--- Test Encrypt/Decrypt ---\n";
echo "Encrypted (base64): " . base64_encode($encrypted) . PHP_EOL;
echo "Decrypted: " . $decrypted . PHP_EOL;
echo $decrypted === $message ? "Success\n" : "Failure\n";