¿Cómo funciona (Py) NaCl exactamente?

1

En este momento, trato con PyNaCl ( Docs ) y tengo una pregunta al respecto:

Mi situación es que quiero crear un servidor que interactúe con los clientes. Tanto el servidor como el cliente tendrán una clave / par clave privada a largo plazo.

Por lo tanto, la situación será que el cliente enviará una solicitud cifrada al servidor y que el servidor la descifre.

El proceso de cifrado (por parte del cliente) es relativamente fácil:

encrypted = client_box.encrypt(message, nonce)

Y el servidor puede descifrarlo de esta manera (dicen los documentos):

plaintext = server_box.decrypt(encrypted)

Ahora a la pregunta:

Para el cifrado, se utiliza un código de 24 bytes para una mejor seguridad. Pero lo que no entiendo: ¿el servidor también tiene que conocer esta fuente de 24 bytes? En los documentos, el descifrado se realiza sin que parezca un error.

Pero los Docs dicen que también puedo usar un nonce para descifrado ( link ) para que se vea de esta manera:

plaintext = server_box.decrypt(encrypted, nonce)

Pero en el ejemplo en los documentos no usan el nonce en el proceso de descifrado.

¿Puede, por favor, que alguien me explique cuándo debo usar el nonce y qué nonce debo usar entonces?

    
pregunta Aliquis 05.06.2016 - 10:21
fuente

1 respuesta

3

Wow, estoy muy impresionado con esa página de documento de PyNaCl a la que has vinculado; Entre otras cosas, no explican para qué se utiliza internamente este nonce. Eso hace que sea difícil responder a tu pregunta. Dicho esto, el código de ejemplo tiene algunos comentarios que dan pistas sobre lo que está haciendo dentro, por lo que creo que podemos resolverlo.

Por lo general, un "nonce" es una cadena aleatoria que se inserta en el mensaje antes de marcarlo / firmarlo para hacer que el hash sea único cada vez, y evitar los ataques de repetición. Normalmente no ves nonces con funciones de cifrado.

La documentación real enumera tanto encrypt como decrypt de la siguiente manera:

  

cifrar (texto plano, nonce, codificador)

     

descifrar (texto cifrado, nonce, codificador)

sin evidencia de que nonce o encoder son opcionales, y no hay explicación de por qué una función de encriptación necesita un nonce, pero luego el código de ejemplo hace lo siguiente:

# 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)

Entonces:

  1. Parece que tanto encrypt como decrypt pueden usarse con 1 o 2 parámetros faltantes. Sería bueno si explicara exactamente cuál es el comportamiento en esos casos, pero no importa.

  2. El nonce se almacenará dentro del texto cifrado, por lo que no debería necesitar enviarlo por separado.

  3. El comentario " an exception will be raised if the encryption was tampered with " me hace creer que el texto cifrado es MACed , lo que explicaría ¿Por qué necesitan un nonce? Es para el hash MAC.

respondido por el Mike Ounsworth 05.06.2016 - 19:45
fuente

Lea otras preguntas en las etiquetas