Estoy utilizando una técnica tomada de un libro de Bruce Schneier y Niels Ferguson llamado Criptografía práctica . Básicamente, se reduce a esto:
Bob hace esto:
pubk_A = clave pública de Alice
entropía = bytes de PRNG
encrypted_entropy = RSA_Encrypt pubk_A (entropía)
hashed_entropy = SHA2-512 (entropía)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
Bob luego envía encrypted_entropy a Alice.
Entonces Alice hace esto:
privk_A = clave privada de Alice
entropy = RSA_Decrypt privk_A (encrypted_entropy)
hashed_entropy = SHA2-512 (entropía)
encrypt_key BA = hashed_entropy [0:32]
encrypt_nonce BA = hashed_entropy [32:48]
hmac_key BA = hashed_entropy [48:64]
Esto funciona muy bien para generar claves que pueden usarse para comunicarse de Bob a Alice. Pero necesito llaves que pueda usar en ambas direcciones. Estaba pensando en modificar el algoritmo de esta manera:
Bob hace esto con entropía:
pubk_B = clave pública de Bob
hashed_entropy BA = SHA2-512 ( SHA2-256 (pubk_A) || entropy)
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) || entropy)
encrypt_key AB = hashed_entropy [0:32]
encrypt_nonce AB = hashed_entropy [32:48]
hmac_key AB = hashed_entropy [48:64]
Alice puede hacer lo mismo de su lado después de obtener la entropía al descifrar encrypted_entropy.
Como puede ver, ahora hay dos conjuntos de teclas, una utilizada para comunicarse de Bob a Alice y otra para comunicarse de Alice a Bob.
¿Hay algo malo con esto? ¿Qué riesgos de seguridad estoy tomando? ¿La seguridad del sistema es menor o mayor que si solo tuviera una parte modificada un poco en la lista? ¿Hay una mejor manera de manejar este problema sin agregar viajes de ida y vuelta?