Não use na produção, este está em um estado POC
Exemplo básico está disponível no diretório 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/splitty-your-secrets-with-hamirs-secret-sher-scheme/
https://www.geeksforgeeks.org/shamirs-secret-sharing-algorithm-cryptography/
https://ericafaloff.com/shamirs-secret-shercharing-scheme/
O esquema de compartilhamento secreto de Sharmir oferece segurança teórica da informação, o que significa que a matemática que exploramos foi provada a ser inquebrável, mesmo contra um invasor com poder de computação ilimitado. No entanto, o esquema ainda contém alguns problemas conhecidos.
Por exemplo, o esquema de Shamir não produz ações verificáveis, o que significa que os indivíduos são livres para enviar ações falsas e impedir que o segredo correto seja reconstruído. Um detentor de ações adversárias com informações suficientes pode até produzir uma participação diferente, de modo que a SS seja reconstruída para um valor de sua escolha. Esta questão é abordada por esquemas verificáveis de compartilhamento secreto, como o esquema de Feldman.
Outra questão é que, como o comprimento de qualquer ação é igual ao comprimento de um segredo associado, a duração de um segredo é facilmente vazada. Este problema é trivial para corrigir simplesmente preenchendo o segredo para um comprimento fixo que deve ser feito com sódio, conforme demonstrado nos exemplos.
Finalmente, é importante observar que nossas preocupações com a segurança podem se estender além do próprio esquema. Para as aplicações de criptografia do mundo real, muitas vezes há a ameaça de ataques de canal lateral, nos quais um invasor tenta extrair informações úteis do tempo de aplicação, cache, falha e muito mais. Se isso é uma preocupação, considerações cuidadosas devem ser feitas durante o desenvolvimento, como o uso de funções e pesquisas constantes de tempo, impedindo a memória de pagar para disco e um monte de outras coisas que estão além do escopo desta biblioteca.