Sto lavorando sulla crittografia batch di file, per un mio piccolo progetto. I file vengono archiviati crittografati su un'unità rimovibile e le chiavi vengono archiviate su un server affidabile. Per una maggiore sicurezza, mi piacerebbe usare UN tasto per UN file. I file sono criptati usando NaCl / libsodium's "sealed_box" (Curve25519xsalsa20poly1305).
Ogni volta che il client aggiunge un file all'unità, viene crittografato utilizzando una chiave pubblica, generata con fun1(masterPublicKey, seed)
. Il seed
è esso stesso generato deterministicamente da un insieme di attributi di file non variabili, e masterPublicKey
è, beh, una chiave pubblica che appartiene al client e viene riutilizzata per tutti i file appartenenti a questo client.
Ogni volta che il client richiede la decrittografia per un file, il seed
viene inviato al server. Raccoglie quindi la chiave privata del client e chiama fun2(privateKey, seed)
per ottenere una chiave privata derivata. Questa chiave viene inviata al client, che ora può decifrare il file che desiderava, ma NONE degli altri file.
On the server (decryption):
[master private key] \
\ / seed from client
\ /
\ fun(privateKey, seed)
-> derived private key
On the client (encryption):
[master public key] \
\ / getSeed(attributes)
\ /
\ fun(publicKey, seed)
-> derived public key
Se sei esperto di bitcoin, pensa BIP32 ma per la crittografia.
Come ottenere una cosa del genere? C'è anche un modo per farlo?