Domanda

Quali sono i fondamenti per realizzare la crittografia dei dati con esattamente due chiavi (che potrebbero essere basate su password), ma necessitando solo di una (una delle due) delle due chiavi per decrittografare i dati?

Ad esempio, i dati vengono crittografati con la password di un utente e la password della sua azienda, quindi l'utente o la sua azienda possono decrittografare i dati.Nessuno dei due conosce l'altra password.Viene archiviata solo una copia dei dati crittografati.

Non intendo chiave pubblica/privata.Probabilmente tramite crittografia a chiave simmetrica e forse implica qualcosa come XORing le chiavi insieme per usarle per la crittografia.

Aggiornamento:Vorrei anche trovare una soluzione che non implichi affatto la conservazione delle chiavi.

È stato utile?

Soluzione

Il modo in cui ciò avviene abitualmente è generare un'unica chiave simmetrica per crittografare i dati.Quindi crittografa la chiave simmetrica con la chiave o la password di ciascun destinatario in modo che possano decrittografarla autonomamente.S/MIME (in realtà la sintassi del messaggio crittografico su cui si basa S/MIME) utilizza questa tecnica.

In questo modo, devi archiviare solo una copia del messaggio crittografato, ma più copie della sua chiave.

Altri suggerimenti

In generale, ciò che fai è crittografare i dati con una chiave generata casualmente, quindi aggiungere le versioni di quella chiave casuale che sono state crittografate con ogni chiave conosciuta.Quindi chiunque abbia una chiave valida può scoprire la chiave "reale" utilizzata per crittografare i dati.

Se ho capito bene, hai dei dati che sei disposto a crittografare e distribuire la chiave di crittografia divisa in n "pezzi chiave". (Nel tuo caso 2 pezzi)

Per questo potresti usare la suddivisione basata su XOR, ecco come funziona:Fornisci il numero richiesto di pezzi - n, e la chiave segreta - K.Per generare n pezzi della tua chiave, devi creare (n – 1) numeri casuali:R1, R2, R3, ..., Rn−1.Per questo puoi utilizzare un generatore di numeri SecureRandom, che ci impedirà i duplicati. Quindi esegui la funzione XOR su questi pezzi Rn-1 e sulla tua chiave - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ K

Ora hai i tuoi n pezzi:R1, R2, R3, …, Rn-1, Rn e puoi distruggere la K.Questi pezzi possono essere distribuiti nel tuo codice o inviati agli utenti.

Per rimontare la chiave, utilizziamo l'operazione XOR sui nostri pezzi Rn:
K = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ Rn

Con la funzione XOR (⊕) ogni pezzo è intrinsecamente importante nella ricostruzione della chiave, se qualche bit in uno qualsiasi dei pezzi viene modificato, la chiave non è recuperabile.

Per maggiori informazioni e codice, puoi dare un'occhiata all'utilità Android che ho scritto a tale scopo:
Progetto GitHub: https://github.com/aivarsda/Secret-Key-Split-Util

Inoltre puoi provare l'app demo Secret Key Splitter che utilizza quell'utilità:
Google Play: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

Penso di aver pensato a una soluzione che avrebbe funzionato:

D = data to encrypt
h1 = hash(userpassword)
h2 = hash(companyPassword)
k = h1 concat h2

E = function to encrypt
//C is the encrypted data
C = E_h1(h2) concat E_h2(h1) concat E_k(D)

Quindi ciascuna persona può decrittografare l'hash dell'altra persona e quindi combinarli per decrittografare il resto dei dati.

Forse esiste una soluzione migliore di questa?

Nel caso più generale, un segreto (in questa applicazione, una chiave di decrittografia per i dati) può essere suddiviso in condivisioni in modo tale che sia richiesto un certo numero di soglia di tali condivisioni per recuperare il segreto.Questo è noto come condivisione segreta o con n condivisioni e una soglia di t, uno schema di soglia (t,n).

Un modo per farlo è creare un polinomio di ordine t-1, impostando il segreto come primo coefficiente e scegliendo il resto dei coefficienti in modo casuale.Quindi, vengono selezionati n punti casuali su questa curva che diventano le azioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top