No se use en producción, esto está en un estado de POC
El ejemplo básico está disponible en el directorio de examples .
<?php
declare (strict_types= 1 );
require ' ../vendor/autoload.php ' ;
use Gheb ShamirSecretSharingScheme SodiumHelper ;
use Gheb ShamirSecretSharingScheme ShamirSecretSharingHelper ;
$ secretKey = SodiumHelper:: generateKey (); // this will be stored in shares.
$ nonce = SodiumHelper:: generateNonce (); // this could be part of your app configuration
$ secret = ' Sensitive information ' ;
var_dump ( " secret : $ secret " );
// symmetric key encryption with padded message to hide it's length. This does not matter, it's for show !
$ encryptedMessage = SodiumHelper:: encrypt ( $ secret , $ secretKey , $ nonce );
// This is the best part !
// It splits the secret key into 3 shares. (but it could be more)
// initialisation of modulo value, addressing insecure integer arithmetic.
// this would be part of your app configuration or stored elsewhere.
$ m = " 997 " ; // chose any prime number (here around 1000)
$ points = ShamirSecretSharingHelper:: getShareablePoints ( $ secretKey , $ m , 3 );
var_dump ( $ points );
// there you can store your points at different locations.
// and later get them back to get your secret back
// reconstructing and decrypting
// to reconstruct the secretKey the 3 points are needed along the
$ decryptedSecretKey = ShamirSecretSharingHelper:: reconstructSecret ( $ points , $ m );
$ decryptedSecret = SodiumHelper:: decrypt ( $ encryptedMessage , $ nonce , $ decryptedSecretKey );
var_dump ( " decrypted secret : $ decryptedSecret " ); https://en.wikipedia.org/wiki/homomorphic_secret_sharing
https://en.wikipedia.org/wiki/shamir%27s_secret_sharing
https://wiki.owasp.org/index.php/security_by_design_principles
https://kariera.future-processing.pl/blog/splitting-your-secrets-with-shamirs-secret-sharing-scheme/
https://www.geeksforgeeks.org/shamirs-secret-secret-algorithm-cryptography/
https://ericrafaloff.com/shamirs-secret-sharing-scheme/
El esquema de intercambio secreto de Sharmir ofrece seguridad teórica de información, lo que significa que las matemáticas que exploramos se ha demostrado que son inquebrantables, incluso contra un atacante con poder informático ilimitado. Sin embargo, el esquema todavía contiene un par de problemas conocidos.
Por ejemplo, el esquema de Shamir no produce acciones verificables, lo que significa que las personas son libres de presentar acciones falsas y evitar que el secreto correcto sea reconstruido. Un titular de acciones adversas con suficiente información puede incluso producir una participación diferente, de modo que SS se reconstruye a un valor de su elección. Este problema se aborda por esquemas verificables de intercambio secreto como el esquema de Feldman.
Otro problema es que debido a que la longitud de cualquier parte dada es igual a la longitud de un secreto asociado, la longitud de un secreto se filtra fácilmente. Este problema es trivial de solucionar simplemente acolchando el secreto a una longitud fija que debe hacerse con sodio como se demuestra en los ejemplos.
Finalmente, es importante tener en cuenta que nuestras preocupaciones sobre la seguridad pueden extenderse más allá del esquema en sí. Para las aplicaciones de criptografía del mundo real, a menudo existe la amenaza de ataques de canales laterales, en el que un atacante intenta extraer información útil del tiempo de aplicación, almacenamiento en caché, fallas y más. Si esto es una preocupación, se deben hacer consideraciones cuidadosas durante el desarrollo, como el uso de funciones y búsquedas de tiempo constantes, evitando que la memoria se pague al disco y un montón de otras cosas que están más allá del alcance de esta biblioteca.