Signatur
Beschreibung
sodium_crypto_core_ristretto255_scalar_add() führt eine modulare Addition zweier Skalare im Kontext der Ristretto255-Kurvengruppe durch. Beide Eingabewerte müssen binäre Strings der Länge SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES (32 Bytes) sein. Das Ergebnis ist ebenfalls ein 32-Byte-String, der dem Wert x + y mod l entspricht, wobei l die Primordnung der Ristretto255-Gruppe ist.
Ristretto255 ist ein kryptografischer Primitivbaustein, der auf Curve25519 basiert und eine sichere, eindeutige Darstellung von Punkten auf der Kurve bietet. Skalare sind ganzzahlige Werte, mit denen Punkte multipliziert oder kombiniert werden können. Die modulare Skalarmathematik ist ein wesentlicher Bestandteil kryptografischer Protokolle wie Zero-Knowledge-Proofs, verteilter Schlüsselgenerierung (DKG) oder Blind-Signaturen.
Diese Funktion eignet sich besonders, wenn Geheimnisse oder Nonces arithmetisch kombiniert werden müssen, ohne die Sicherheitseigenschaften der Gruppenstruktur zu verletzen. Die Addition erfolgt vollständig im Zahlenbereich der Gruppenordnung, sodass keine Überläufe oder Nebenkanalprobleme durch einfache Integer-Arithmetik entstehen.
Wichtig: Beide Eingabe-Skalare müssen kanonische, reduzierte Skalare sein. Zum Erzeugen eines zufälligen Skalars sollte sodium_crypto_core_ristretto255_scalar_random() genutzt werden. Für die Reduktion eines beliebigen Wertes steht sodium_crypto_core_ristretto255_scalar_reduce() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x Pflicht | string | Erster Skalar als binärer String mit exakt SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES (32) Bytes. Muss ein kanonischer reduzierter Skalar modulo der Gruppenordnung sein. |
|
| $y Pflicht | string | Zweiter Skalar als binärer String mit exakt SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES (32) Bytes. Muss ein kanonischer reduzierter Skalar modulo der Gruppenordnung sein. |
Rückgabewert
x + y mod l darstellt, wobei l die Primordnung der Ristretto255-Gruppe ist. Wirft eine SodiumException, wenn die Eingaben ungültig oder falsch lang sind.Beispiele
Zwei zufällige Skalare addieren
<?php
// Zwei zufällige Ristretto255-Skalare erzeugen
$skalar1 = sodium_crypto_core_ristretto255_scalar_random();
$skalar2 = sodium_crypto_core_ristretto255_scalar_random();
// Skalare addieren (modulo Gruppenordnung)
$summe = sodium_crypto_core_ristretto255_scalar_add($skalar1, $skalar2);
echo 'Skalar 1: ' . sodium_bin2hex($skalar1) . PHP_EOL;
echo 'Skalar 2: ' . sodium_bin2hex($skalar2) . PHP_EOL;
echo 'Summe: ' . sodium_bin2hex($summe) . PHP_EOL;
echo 'Länge: ' . strlen($summe) . ' Bytes' . PHP_EOL;
Additive Geheimnisteilung (Additive Secret Sharing)
<?php
// Geheimnis als Skalar erzeugen
$geheimnis = sodium_crypto_core_ristretto255_scalar_random();
// Ersten zufälligen Anteil erzeugen
$anteil1 = sodium_crypto_core_ristretto255_scalar_random();
// Zweiten Anteil so berechnen, dass anteil1 + anteil2 = geheimnis
$anteil2 = sodium_crypto_core_ristretto255_scalar_sub($geheimnis, $anteil1);
// Rekonstruktion: Anteile wieder addieren
$rekonstruiert = sodium_crypto_core_ristretto255_scalar_add($anteil1, $anteil2);
// Verifikation
if (hash_equals($geheimnis, $rekonstruiert)) {
echo 'Geheimnis erfolgreich rekonstruiert!' . PHP_EOL;
} else {
echo 'Fehler bei der Rekonstruktion.' . PHP_EOL;
}
echo 'Geheimnis: ' . sodium_bin2hex($geheimnis) . PHP_EOL;
echo 'Rekonstruiert: ' . sodium_bin2hex($rekonstruiert) . PHP_EOL;
// Wichtig · Fallstricke
Eingabelänge: Beide Parameter müssen exakt SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES (32 Bytes) lang sein. Kürzere oder längere Strings führen zu einer SodiumException.
Kanonische Skalare: Die Funktion erwartet bereits reduzierte Skalare. Willkürliche 32-Byte-Werte können außerhalb des gültigen Bereichs liegen. Nutze sodium_crypto_core_ristretto255_scalar_reduce(), um beliebige Werte zu reduzieren.
Verfügbarkeit: Diese Funktion ist nur verfügbar, wenn die installierte libsodium-Bibliothek Ristretto255-Unterstützung mitbringt (libsodium >= 1.0.18). Prüfe die Verfügbarkeit ggf. mit defined('SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES').
Sicherheit: Skalare, die private Schlüssel oder Geheimnisse repräsentieren, sollten niemals in Logs oder Fehlerausgaben erscheinen. Der Vergleich von Skalaren sollte stets mit hash_equals() erfolgen, um Timing-Angriffe zu vermeiden.