Sto usando una tecnica presa a prestito da un libro di Bruce Schneier e Niels Ferguson intitolato Crittografia pratica . Fondamentalmente, si riduce a questo:
Bob fa questo:
pubk_A = chiave pubblica di Alice
entropy = byte da PRNG
encrypted_entropy = RSA_Encrypt pubk_A (entropia)
hashed_entropy = SHA2-512 (entropia)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
Bob invia quindi encrypted_entropy ad Alice.
Quindi Alice fa questo:
privk_A = Chiave privata di Alice
entropy = RSA_Decrypt privk_A (encrypted_entropy)
hashed_entropy = SHA2-512 (entropia)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
Funziona alla grande per la generazione di chiavi che possono essere utilizzate per comunicare da Bob ad Alice. Ma ho bisogno di chiavi che posso usare in entrambe le direzioni. Stavo pensando di modificare l'algoritmo in questo modo:
Bob lo fa con entropia:
pubk_B = Chiave pubblica di Bob
hashed_entropy BA = SHA2-512 ( SHA2-256 (pubk_A) || entropia)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
hashed_entropy AB = SHA2-512 ( SHA2-256 (pubk_B) || entropia)
encrypt_key AB = hashed_entropy [0:32]
encrypt_nonce AB = hashed_entropy [32:48]
hmac_key AB = hashed_entropy [48:64]
Alice può fare la stessa cosa dalla sua parte dopo aver ottenuto l'entropia decodificando encrypted_entropy.
Come puoi vedere, ora ci sono due serie di chiavi, una usata per comunicare da Bob ad Alice e un'altra per comunicare da Alice a Bob.
C'è qualcosa di sbagliato in questo? Quali rischi per la sicurezza sto prendendo? La sicurezza del sistema è minore o maggiore di quella che se avessi semplicemente un partito modificato un po 'nel nonce? C'è un modo migliore per gestire questo problema senza aggiungere round trip?