Un buon primo passo sarebbe introdurre qualcosa di simile a una chiave di sessione, e quindi usare un codice a blocchi per crittografare il carico utile effettivo.
La crittografia funzionerebbe in questo modo:
- Genera una passphrase casuale che dovrebbe più o meno essere globalmente unica e non dovrebbe mai essere riutilizzata. Se hai bisogno di modificare il file crittografato e di ricodificarlo, genera una nuova chiave.
- Cifra che ha generato la passphrase usando ED 25519 e memorizza l'output in testa al file insieme ad altri metadati (es .: IV per il codice a blocchi, ecc.).
- Firma la tua passphrase crittografata usando ED 25519, in modo da non decifrare mai qualcosa che non è stato generato da te. Memorizzalo accanto alla chiave AES crittografata nel passaggio precedente.
- Usando la tua passphrase casuale per il tuo codice a blocchi, crittografa il payload usando qualcosa con autenticazione come AES in modalità GCM, o AES in modalità CBC con un HMAC.
- Alla fine del file, genera una firma del testo cifrato, dimostrando che tu, detentore della chiave privata, garantisci la sua integrità.
Questo ti dà molti benefici. In primo luogo, stai utilizzando un codice a blocchi standard per il tuo payload, e AES (nelle giuste modalità operative) non è vulnerabile agli attacchi di testo in chiaro noti. In secondo luogo, ora che utilizzi un codice a blocchi standard, la crittografia e la decrittografia saranno operazioni molto più veloci nel tempo della CPU. In terzo luogo, l'uso di una modalità di cifratura a blocchi che ha l'autenticazione ti dà integrità e, firmando il testo cifrato, asserisci che non solo il messaggio non è stato manomesso, è stato tu chi lo ha creato.
Il passaggio 5 di cui sopra potrebbe non essere necessario, in quanto la firma nel passaggio 3 dovrebbe essere abbastanza buona combinata con un codice a blocchi autenticato come AES in modalità GCM o CBC con HMAC.
La decifrazione ha questo aspetto:
- Decifra la tua passphrase casuale usando ED 25519 e controlla la sua firma. Se tutto sembra a posto, procedi, altrimenti fallisci.
- Usa la tua passphrase decrittografata per decrittografare il testo cifrato usando il codice a blocchi. Il codice a blocchi dovrebbe fornire supporto di integrità (GCM o CBC + HMAC) e dovrebbe fallire se qualcosa è stato ottimizzato.
- Allo stesso tempo in cui decifri ogni blocco, inserisci il testo cifrato originale tramite il metodo di verifica delle firme ED 25519 in modo da non dover eseguire nuovamente la scansione dell'intero payload una volta terminato.
- Dopo aver terminato la decrittografia del testo cifrato, verifica che la firma (generata nel passaggio 5 sopra) sia valida.
Questo dovrebbe fornire un sistema di crittografia piuttosto robusto.
Poiché ora vedo che stai principalmente cercando l'autenticazione dei messaggi, ho escogitato un'altra soluzione che fa proprio questo.
Generazione dei codici di autenticazione dei messaggi:
- Genera una chiave casuale da utilizzare con HMAC.
- Cifra e firma quella chiave e incollala nella parte anteriore di ogni messaggio.
- Esegui il tuo HMAC sull'intero testo in chiaro.
- Aggiungi l'output dell'HMAC alla fine.
Convalida dei codici di autenticazione dei messaggi:
- Decifra e convalida la chiave HMAC all'inizio del messaggio.
- Genera un HMAC sul testo in chiaro come sopra.
- Confronta l'output dell'HMAC con l'HMAC memorizzato alla fine del messaggio.
Se si utilizza una buona funzione di hash per l'HMAC (es .: SHA-256), questa dovrebbe essere una buona soluzione. Rimuove efficacemente la tua preoccupazione di attacchi con testo in chiaro per ED 25519 (non che esistano, necessariamente), e in genere sarà una soluzione molto più rapida delle prestazioni rispetto a fare le firme in modo nativo nell'ED 25519.