AEAD e nonces spiegato in parole povere (esempio di crittografia simmetrica con Libsodium)

1

Dopo quasi 4 giorni di lavoro, ho finalmente ottenuto Libsodium crypto_aead_xchacha20poly1305_ietf_encrypt per lavorare e produrre lo stesso risultato in JavaScript e PHP .

Ma sono confuso.

Il PHPDoc descrive i parametri come:

* @param string $plaintext Message to be encrypted
* @param string $assocData Authenticated Associated Data (unencrypted)
* @param string $nonce Number to be used only Once
* @param string $key Encryption key
* @return string

Mentre JSDoc richiede questi parametri:

/**
 * @param {string | Uint8Array} message
 * @param {string | Uint8Array} additional_data
 * @param {string | Uint8Array} secret_nonce
 * @param {Uint8Array} public_nonce
 * @param {Uint8Array} key
 * @param {uint8array} outputFormat
 * @returns {Uint8Array}
 */

Le mie domande:

  1. Sembra che un nonce sia un tipo di sale di una dimensione specifica che può essere utilizzato una sola volta perché altrimenti possono verificarsi attacchi di riproduzione. Potete aiutarmi a capirlo ulteriormente? Wikipedia e altri siti sono diventati troppo complicati.
  2. Per un laico, come descriveresti AEAD e come usare il parametro "Authenticated Associated Data (non criptato)"?
  3. Nella funzione PHP (che ho copiato da link ), utilizza il nonce non solo come nonce ma anche come I "Dati associati autenticati" riducono la sicurezza rispetto ad altri approcci in cui il mittente potrebbe aggiungere qualche valore qui e comunicare offline al ricevitore ciò che il ricevente dovrebbe aspettarsi che questo valore sia?
  4. Perché la versione JavaScript accetta parametri diversi? JS chiede un secret_nonce separato da public_nonce e, per far corrispondere i risultati alla funzione di PHP, ho bisogno di fornire valori identici per secret_nonce e public_nonce. Allora, qual è il punto?

P.S. Ecco le funzioni:

JavaScript:

/**
 * @param {string} message
 * @param {Uint8Array} key
 * @returns {Uint8Array}
 */
function encryptAndPrependNonce(message, key) {
    let nonce = sodium.randombytes_buf(nonceBytes);
    var encrypted = sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(message, nonce, nonce, nonce, key);
    var nonce_and_ciphertext = concatTypedArray(Uint8Array, nonce, encrypted);
    return nonce_and_ciphertext;
}

PHP:

/**
 * @link https://paragonie.com/b/kIqqEWlp3VUOpRD7 (from the 'simpleEncrypt' function)
 * @param string $message
 * @param string $keyAsBinary
 * @return string
 */
public static function encryptAndPrependNonce($message, $keyAsBinary) {
    $nonce = random_bytes(self::NONCE_BYTES); // NONCE = Number to be used ONCE, for each message        
    $encrypted = ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt($message, $nonce, $nonce, $keyAsBinary);
    return $nonce . $encrypted;
}
    
posta Ryan 13.08.2018 - 15:02
fonte

1 risposta

2

It seems like a nonce is a type of salt of a specific size that can only be used once because otherwise replay attacks can happen. Can you help me understand this further? Wikipedia and other sites got too complicated.

È necessario un nonce per assicurarsi che il testo cifrato non perda informazioni. Tale nonce o IV è richiesto per qualsiasi cifrario sicuro CPA poiché il testo in chiaro ripetuto potrebbe altrimenti divulgare informazioni.

Per i codici di flusso - usati dalla maggior parte se non tutte le costruzioni di AEAD - è richiesto un nonce univoco altrimenti si perde tutto il testo in chiaro. Potrebbe anche compromettere la chiave di hash (interna), portando a un completo compromesso della proprietà di autenticità (!!!).

To a layman, how would you describe AEAD and how to use the "Authenticated Associated Data (unencrypted)" parameter?

L'AAD può contenere tutti i dati che devono essere autenticati ma che non devono essere - o non possono essere - mantenuti riservati. Ad esempio: può essere una buona idea proteggere il campo destinatario di un messaggio in un protocollo, ma se è nascosto, la rete potrebbe non essere in grado di portarla a destinazione in primo luogo.

In the PHP function (which I copied from https://paragonie.com/b/kIqqEWlp3VUOpRD7), does using the nonce not just as a nonce but also as the "Authenticated Associated Data" reduce the security compared to some other approach where the sender would add some value here and communicate offline to the receiver what the receiver should expect this value to be?

L'aggiunta di nonce a AAD non aumenta mai la sicurezza , perché la codifica AEAD la include già nel calcolo del tag di autenticazione .

Quanto "un certo valore" aggiunge alla sicurezza dipende ovviamente dal protocollo e dai possibili vettori di attacco. Nota che un nonce deve essere unico, ma il tuo protocollo non può usarlo contro gli attacchi di replay. In tal caso l'aggiunta di dati all'AAD può aiutare a prevenire tali attacchi.

Nota che AEAD richiede già una chiave segreta e un nonce; non è necessario aggiungere un'altra chiave o nonce (per proteggere il codice stesso). L'aggiunta dell'identità delle odi mittente / destinatario ha generalmente un senso.

Why would the JavaScript version accept different parameters? JS asks for a secret_nonce separate from a public_nonce, and in order for the results to match PHP's function, I need to supply identical values for secret_nonce and public_nonce. So what's the point?

La libreria JS in realtà non usa il parametro segreto nonce chiamato nsec . Se leggi la documentazione troverai sempre:

nsec is not used by this particular construction and should always be NULL.

Si noti che poly1305 richiede due chiavi , di cui la seconda "chiave" viene gestita come un numero. Tuttavia, la seconda chiave, in genere denotata r , può essere generata in modo pseudo casuale come specificato qui .

Generalmente è preferibile utilizzare una sola chiave per il cifrario da solo, quindi le implementazioni probabilmente non supporteranno la versione a doppia chiave e genereranno r internamente. Ma io penso è per questo che il parametro nsec esiste in primo luogo.

Per GCM / GHASH anche la chiave è universalmente creata internamente.

    
risposta data 15.08.2018 - 16:33
fonte

Leggi altre domande sui tag