En PSK TLS, ¿cómo se deriva la clave utilizada para el cifrado?

6

Estoy tratando de descifrar un mensaje enviado a través de un canal de comunicación seguro usando TLS_PSK_WITH_3DES_EDE_CBC_SHA . Ahora tengo el número aleatorio del cliente, el número aleatorio del servidor, la identidad PSK y el valor PSK. Mi problema es cómo obtener la clave que se utilizó para el cifrado y descifrado.

He leído RFC 2246 TLS 1.0 y RFC 4279, conjuntos de sistemas de cifrado de clave precompartidos para estándares TLS. Según tengo entendido, durante el protocolo de enlace de PSK TLS entre el cliente y el servidor, el cliente y el servidor acuerdan qué PSK (clave precompartida) usar. Este PSK se utilizará para derivar la clave de sesión. Esta clave de sesión se utiliza para el cifrado y descifrado de mensajes. Sin embargo, durante mi lectura de los estándares, no pude encontrar una fórmula o procedimiento para derivar esto. Encontré una fórmula para calcular el secreto pre-maestro, pero no estoy seguro de si esta es la que se usa para el cifrado o descifrado.

  1. En PSK TLS, ¿el secreto pre-maestro es el mismo que la clave utilizada para el cifrado y descifrado?
  2. Si el secreto precompartido no es el mismo que la clave utilizada para el cifrado y descifrado, ¿cómo se deriva esta clave?
pregunta bookhuntress 13.02.2015 - 16:05
fuente

1 respuesta

5

El secreto del maestro previo se cifra y se intercambia en el protocolo de enlace TLS. Este valor se utiliza para derivar la clave maestra. La clave maestra se usa para derivar todo el otro material de claves pasándolo a una función pseudoaleatoria (PRF), y combinando otras piezas de datos del protocolo de enlace.

Derivando el Pre-Master Secret para un PSK

De RFC427: Sección 2

  

El secreto premaster se forma de la siguiente manera: si el PSK tiene N octetos de longitud, concatene un uint16 con el valor N, N cero octetos, un segundo uint16 con el valor N, y el propio PSK.

Si usa Diffie Hellman con PSK, Sección 3 :

  

El secreto premaster se forma de la siguiente manera. Primero, realice el cálculo de Diffie-Hellman de la misma manera que para otros conjuntos de cifrado basados en Diffie-Hellman en [TLS]. Sea Z el valor producido por este cálculo (con los primeros cero bytes eliminados como en otros conjuntos de cifrado basados en Diffie-Hellman). Concatene un uint16 que contenga la longitud de Z (en octetos), Z en sí mismo, un uint16 que contenga la longitud de PSK (en octetos), y el propio PSK.

Si utiliza RSA con PSK, Sección 4

  

El campo EncryptedPreMasterSecret enviado desde el cliente al servidor contiene un número de versión de 2 bytes y un valor aleatorio de 46 bytes, cifrado mediante la clave pública RSA del servidor como se describe en la Sección 7.4.7.1 de [TLS]. El secreto real del premaster está formado por ambas partes de la siguiente manera: concatene un uint16 con el valor 48, el número de versión de 2 bytes y el valor aleatorio de 46 bytes, un uint16 que contiene la longitud del PSK (en octetos), y el PSK sí mismo. (El secreto premaster es, por lo tanto, 52 octetos más largo que el PSK).

Derivando clave maestra

Todo lo que sigue no se aplica solo a TLS PSK; se aplica a todos los tipos de intercambio clave. De RFC 2246: Sección 8.1

  

Para todos los métodos de intercambio de claves, el mismo algoritmo se utiliza para convertir el pre_master_secret en el master_secret. El pre_master_secret se debe eliminar de la memoria una vez que se haya calculado el master_secret. El secreto maestro siempre tiene exactamente 48 bytes de longitud. La longitud del secreto de premaster variará según el método de intercambio de claves.

   master_secret = PRF(pre_master_secret, "master secret",
                       ClientHello.random + ServerHello.random)
   [0..47];

El PRF se define como la combinación de dos funciones de hashing diferentes. Sección 5 de RFC 2246:

  

Primero, definimos una función de expansión de datos, P_hash (secreto, datos) que usa una única función de hash para expandir un secreto y semilla en una cantidad arbitraria de salida:

   P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                          HMAC_hash(secret, A(2) + seed) +
                          HMAC_hash(secret, A(3) + seed) + ...

   Where + indicates concatenation.

   A() is defined as:
       A(0) = seed
       A(i) = HMAC_hash(secret, A(i-1))

La función descrita anteriormente es realmente P_MD5 o P_SHA1 . El TLS PRF se describe a continuación:

  

El PRF de TLS se crea dividiendo el secreto en dos mitades y usando una mitad para generar datos con P_MD5 y la otra mitad para generar datos con P_SHA-1, luego exclusiva (XOR) las salidas de estas dos expansiones funciona en conjunto.

Entonces reclamemos lo siguiente:

L_S = length in bytes of secret;
L_S1 = L_S2 = ceil(L_S / 2);

El PRF es entonces:

PRF(secret, label, seed) = P_MD5(S1, label + seed) XOR
                              P_SHA-1(S2, label + seed);

Derive Encryption Keys

La derivación de la clave se describe en RFC 2246: Sección 6.3

El bloque de teclas completo se deriva de la siguiente manera:

key_block = PRF(SecurityParameters.master_secret,
                "key expansion",
                SecurityParameters.server_random +
                SecurityParameters.client_random);

Una vez que se genera y almacena suficiente material en key_block , key_block se divide en las claves de cifrado / descifrado. El cifrado o descifrado depende de la dirección. Como todos están referenciados como teclas escribir . El key_block se divide secuencialmente en las matrices:

client_write_MAC_secret[SecurityParameters.hash_size]
server_write_MAC_secret[SecurityParameters.hash_size]
client_write_key[SecurityParameters.key_material_length]
server_write_key[SecurityParameters.key_material_length]
client_write_IV[SecurityParameters.IV_size]
server_write_IV[SecurityParameters.IV_size]  

Se realizan algunos cálculos adicionales para cifrados de bloques exportables. También puede leer esos detalles en la Sección 6.3 de RFC2246. Sección 6.3.1 da un ejemplo de estos cálculos sin las descripciones adicionales.

    
respondido por el RoraΖ 13.02.2015 - 17:09
fuente

Lea otras preguntas en las etiquetas