Come funziona (Py) NaCl esattamente?

1

Al momento, mi occupo di PyNaCl ( Documenti ) e ho una domanda al riguardo:

La mia situazione è che voglio creare un server che interagisca con i clienti. Sia il server che il client avranno una chiave privata a lungo termine / keypair.

Quindi, la situazione sarà che il client invierà una richiesta crittografata al server e il server la decrittografa.

Il processo di crittografia (da parte del client) è relativamente semplice:

encrypted = client_box.encrypt(message, nonce)

E il server può decrittografarlo in questo modo (i Documenti dicono):

plaintext = server_box.decrypt(encrypted)

Ora alla domanda:

Per la crittografia viene utilizzato un nonce a 24 byte per una maggiore sicurezza. Ma cosa non capisco: il server deve conoscere anche questo nonce a 24 byte? In Docs la decrittazione viene eseguita senza un nonce sembra.

Ma i documenti dicono che posso anche usare un nonce per la decrittazione ( link ) in modo che appaia in questo modo:

plaintext = server_box.decrypt(encrypted, nonce)

Ma nell'esempio nei documenti non usano il nonce nel processo di decodifica.

Può, per favore, qualcuno mi spiega quando devo usare il nonce e quale nonce devo usare allora?

    
posta Aliquis 05.06.2016 - 10:21
fonte

1 risposta

3

Wow, non sono molto impressionato da quella pagina del documento PyNaCl a cui ti sei collegato; Tra l'altro, non spiegano cosa viene usato internamente a questo nonce. Ciò rende difficile rispondere alla tua domanda. Detto questo, il codice di esempio ha alcuni commenti che danno alcuni indizi su cosa stia facendo all'interno, quindi penso che possiamo risolvere il problema.

Di solito, un "nonce" è una stringa casuale che inserisci nel messaggio prima dell'hashing / firma per rendere l'hash univoco ogni volta, e previene attacchi di replay. Di solito non si vedono noces con le funzioni di crittografia.

La documentazione attuale elenca sia encrypt che decrypt come segue:

encrypt(plaintext, nonce, encoder)

decrypt(ciphertext, nonce, encoder)

senza alcuna prova che nonce o encoder siano opzionali, e nessuna spiegazione del perché una funzione di crittografia ha bisogno di un nonce, ma poi il codice di esempio va e fa questo:

# Encrypt our message, it will be exactly 40 bytes longer than the 
#  original message as it stores authentication information and nonce
#  alongside it.
encrypted = bob_box.encrypt(message, nonce)

...

# Decrypt our message, an exception will be raised if the encryption was
#   tampered with or there was otherwise an error.
plaintext = alice_box.decrypt(encrypted)

  1. Sembra che sia encrypt che decrypt possano essere utilizzati con 1 o 2 parametri mancanti. Sarebbe bello se spiegasse esattamente quale fosse il comportamento in quei casi, ma non importa.

  2. Il nonce verrà memorizzato all'interno del testo cifrato, quindi non dovrai inviarlo separatamente.

  3. Il commento " an exception will be raised if the encryption was tampered with " mi porta a credere che il testo cifrato sia MACed , che spiegherebbe perché hanno bisogno di un nonce - è per l'hash MAC.

risposta data 05.06.2016 - 19:45
fonte

Leggi altre domande sui tag