In PSK TLS, come viene derivata la chiave utilizzata per la crittografia?

6

Sto tentando di decodificare un messaggio inviato tramite un canale di comunicazione sicuro utilizzando TLS_PSK_WITH_3DES_EDE_CBC_SHA . Ora ho il numero casuale del client, il numero casuale del server, l'identità PSK e il valore PSK. Il mio problema è come derivare la chiave utilizzata per la crittografia e la decrittografia.

Ho letto RFC 2246 TLS 1.0 e RFC 4279 Ciphersuites con chiave pre-condivisa per gli standard TLS. La mia comprensione è che durante l'handshake di PSK TLS tra client e server, il client e il server concordano su quale PSK (chiave pre-condivisa) utilizzare. Questo PSK verrà utilizzato per ricavare la chiave di sessione. Questa chiave di sessione viene utilizzata per la crittografia e la decrittografia dei messaggi. Tuttavia, durante la mia lettura degli standard, non sono riuscito a trovare una formula o una procedura per ricavarla. Ho trovato una formula per calcolare il segreto pre-master ma non sono sicuro che sia quella usata per la crittografia o la decrittografia.

  1. In PSK TLS, il segreto pre-master è uguale alla chiave utilizzata per la crittografia e la decrittografia?
  2. Se il segreto precondiviso non è uguale alla chiave utilizzata per la crittografia e la decrittografia, come viene derivata questa chiave?
posta bookhuntress 13.02.2015 - 16:05
fonte

1 risposta

5

Il segreto pre-master è crittografato e scambiato nell'handshake TLS. Questo valore viene utilizzato per derivare la chiave principale. La chiave master viene utilizzata per ricavare tutti gli altri materiali per la trasparenza passandoli in una funzione pseudo-casuale (PRF) e combinando altri dati dall'handshake.

Derivazione del segreto pre-master per un PSK

Da RFC427: Sezione 2

The premaster secret is formed as follows: if the PSK is N octets long, concatenate a uint16 with the value N, N zero octets, a second uint16 with the value N, and the PSK itself.

Se utilizzi Diffie Hellman w / PSK, Sezione 3 :

The premaster secret is formed as follows. First, perform the Diffie-Hellman computation in the same way as for other Diffie-Hellman-based ciphersuites in [TLS]. Let Z be the value produced by this computation (with leading zero bytes stripped as in other Diffie-Hellman-based ciphersuites). Concatenate a uint16 containing the length of Z (in octets), Z itself, a uint16 containing the length of the PSK (in octets), and the PSK itself.

Se utilizzi RSA w / PSK, Sezione 4

The EncryptedPreMasterSecret field sent from the client to the server contains a 2-byte version number and a 46-byte random value, encrypted using the server's RSA public key as described in Section 7.4.7.1 of [TLS]. The actual premaster secret is formed by both parties as follows: concatenate a uint16 with the value 48, the 2-byte version number and the 46-byte random value, a uint16 containing the length of the PSK (in octets), and the PSK itself. (The premaster secret is thus 52 octets longer than the PSK.)

Chiave master derivante

Tutto ciò che segue non solo si applica a TLS PSK; si applica a tutti i tipi di scambio di chiavi. Da RFC 2246: Sezione 8.1

For all key exchange methods, the same algorithm is used to convert the pre_master_secret into the master_secret. The pre_master_secret should be deleted from memory once the master_secret has been computed. The master secret is always exactly 48 bytes in length. The length of the premaster secret will vary depending on key exchange method.

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

Il PRF è definito come combinazione di due diverse funzioni di hashing. Sezione 5 di RFC 2246:

First, we define a data expansion function, P_hash(secret, data) which uses a single hash function to expand a secret and seed into an arbitrary quantity of output:

   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 funzione sopra descritta è in realtà P_MD5 o P_SHA1 . Il PRS TLS è descritto come segue:

TLS's PRF is created by splitting the secret into two halves and using one half to generate data with P_MD5 and the other half to generate data with P_SHA-1, then exclusive-or'ing (XOR) the outputs of these two expansion functions together.

Quindi consenti quanto segue:

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

Il PRF è quindi:

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

Ricava chiavi di crittografia

La derivazione della chiave è descritta nella RFC 2246: Sezione 6.3

L'intero keyblock è derivato come segue:

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

Una volta generato materiale sufficiente e memorizzato in key_block , key_block viene suddiviso nelle chiavi di crittografia / decrittografia. La crittografia o la decrittografia dipende dalla direzione. Poiché sono tutti referenziati come chiavi scrivi . key_block viene suddiviso sequenzialmente negli array:

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]  

Ci sono alcuni calcoli aggiuntivi eseguiti per cifrari a blocchi esportabili. Puoi leggere questi dettagli anche nella Sezione 6.3 di RFC2246. Sezione 6.3.1 fornisce un esempio di questi calcoli senza le descrizioni aggiuntive.

    
risposta data 13.02.2015 - 17:09
fonte

Leggi altre domande sui tag