Start · Sprachen · PHP · Referenz · sodium_crypto_core_ristretto255_scalar_add

sodium_crypto_core_ristretto255_scalar_add

Funktion

Addiert zwei Ristretto255-Skalare modulo der Gruppenordnung und gibt das Ergebnis als binären String zurück.

seit PHP 8.1.0 Kategorie: crypto

Signatur

sodium_crypto_core_ristretto255_scalar_add(string $x, string $y): string

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

Typ
string
Beschreibung
Gibt einen binären String mit 32 Bytes zurück, der das Ergebnis der modularen Addition 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;
Skalar 1: (32-Byte-Hex-String zufällig) Skalar 2: (32-Byte-Hex-String zufällig) Summe: (32-Byte-Hex-String modulo l) Länge: 32 Bytes

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;
Geheimnis erfolgreich rekonstruiert! Geheimnis: (32-Byte-Hex) Rekonstruiert: (32-Byte-Hex, identisch)

// 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.