¿Puedo usar el descifrado de transmisión por cada algoritmo?

-1

Me gustaría transmitir archivos cifrados desde un servidor. Sé que, por ejemplo, RSA admite el descifrado de secuencias. No estoy seguro de si Twofish o Rijndael también lo admiten.

Supongo que si no son compatibles, se puede implementar al dividir los datos en fragmentos de tamaño conocido y cifrar el fragmento real en lugar de toda la información. Entonces el resultado será algo como esto:

[enc(chunk(data, 0)), enc(chunk(data, 1)), ... enc(chunk(data, index))]

en lugar de

[chunk(enc(data), 0)), chunk(enc(data), 1)), ... chunk(enc(data), index))]

¿Tengo razón, o estos algoritmos fueron diseñados con soporte de transmisión en mente?

Para aclarar lo que quise decir con "descifrado de transmisión":

El streaming se describe en el manual node.js muy bien, pero es un concepto general y un Linux bien conocido característica, por lo que no debe ser nuevo para cualquier programador. Es más o menos el envío de un archivo grande en trozos pequeños, por lo que puede comenzar a trabajar con él (pantalla, transformación, etc.) antes de que llegue el archivo completo y no tiene que mantener todo el archivo en la memoria, lo que reduce la memoria. consumo.

El descifrado de secuencias utiliza un secuencia de transformación para descifrar los datos. Así que lees una pequeña parte del texto cifrado, la descifras y escribes la parte de datos resultante en otra secuencia. Puede haber varios problemas aquí, por ejemplo, el texto cifrado tiene un tamaño diferente al de los datos reales, por lo que si desea buscar los datos necesita convertir el índice de datos al índice de texto cifrado. Otro problema que al descifrar un fragmento de tamaño arbitrario podría no resultar en los mismos datos que obtendría al descifrar todo el texto cifrado y dividirlo en trozos después de eso.

    
pregunta inf3rno 18.11.2017 - 04:34
fuente

2 respuestas

6

No estoy seguro de lo que quieres decir con "descifrado de transmisión". En criptografía, un cifrado simétrico es un cifrado de bloque o un cifrado de flujo. No tiene nada que ver con la "transmisión de datos", sino con la cantidad que se procesa a la vez.

RSA y criptografía asimétrica

RSA es un cifrado asimétrico. No está realmente diseñado para cifrar datos, sino más bien para cifrar un pequeño valor aleatorio que se utilizará como un secreto compartido para un cifrado simétrico más tradicional. Esto a veces se denomina criptografía híbrida. RSA es muy lento y muy ineficiente en cuanto al espacio por sí solo.

Cifras de bloque

Un cifrado de bloque puede cifrar datos en fragmentos del tamaño de bloque del cifrado (128 bits para AES, por ejemplo). Si el tamaño del texto sin cifrar que se va a cifrar no es exactamente divisible por el tamaño de bloque, debe rellenarse. Un cifrado de bloque se utiliza normalmente con un "modo de operación", que proporciona seguridad adicional dependiendo de cómo se usa, y en ocasiones también de autenticación. Cada modo solo debe usarse para un propósito específico. Usar un modo para el propósito equivocado puede ser peligroso.

Estos cifrados funcionan al aplicar varias rondas de cifrado a un solo bloque de datos con una clave determinada. El cambio de cualquier bit en el bloque de texto simple da como resultado que cada bit en el bloque de texto cifrado sea aleatorio. Todos los cifrados de bloque funcionan de la manera que usted describe, es decir, actúan en trozos individuales, uno a la vez.

Un ejemplo de cifrado de bloque es AES. No es un cifrado de flujo como usted afirma.

Cifras de flujo

Por otra parte, un cifrado de flujo puede cifrar bits individuales, uno a la vez. A menudo también son muy rápidos. Estos cifrados funcionan cifrando cada bit, uno a la vez. El cambio de un bit en el texto simple generalmente da como resultado que el bit correspondiente en el texto cifrado se invierta.

Un ejemplo de un cifrado de flujo es ChaCha20.

Cifras de bloque que se utilizan como cifrados de flujo

Algunos modos de operación pueden hacer que los cifrados de bloque actúen como cifrados de flujo. Por lo general, esto se hace al tener un modo de operación que crea un flujo de datos aleatorio determinista (como un flujo de bloques de texto sin formato, cada uno con números incrementales) que luego se XORediza con los datos a cifrar.

Un ejemplo de cifrado de bloque en un modo de transmisión es AES en modo CTR.

    
respondido por el guest 18.11.2017 - 07:07
fuente
3

Estoy bastante seguro de que no está hablando de cifrados de flujo (un método para generar de manera determinista un flujo de bits pseudoaleatorios que tiene una longitud arbitraria). Es por eso que no voy a entrar en las diferencias entre cifrados de bloque, cifrados de flujo y cómo se puede construir uno a partir del otro.

Mi razonamiento es que, de hecho, dices que RSA tenía

  

compatibilidad con el descifrado de secuencias

(que es incorrecto).

En lo que me centraré es en una vista de alto nivel sobre el tamaño de bloque / bloque y los resultados de eso, porque ese parece ser el punto aquí.

RSA

RSA tiene un tamaño de bloque de como máximo la longitud de la clave. Eso es debido a cómo se construye RSA. En un nivel alto, hay una multiplicación en curso y luego el resto de una división es el texto cifrado; si pone demasiada información en esto, el resto de esa división será, cuando se descifre, no lo mismo (es decir, porque deja el anillo de módulo RSA y usa un texto simple no válido).

Para solucionar este problema y hacer que RSA pueda cifrar longitudes de datos arbitrarias, se usan reglas estandarizadas para estructurar el texto sin formato en trozos que pasan por RSA y luego combinarlos en un texto cifrado.

Esta es la razón por la que puede descifrar parcialmente un texto de cifrado RSA: cada uno de esos fragmentos se puede descifrar con (solo) el conocimiento de los anteriores.

Esto no tiene nada que ver con un cifrado de flujo (donde cada bit se puede descifrar como viene), pero uno puede parecer como una transmisión porque 4096 bits no son mucho para que una máquina o una red hoy en día almacenen en búfer o reciban. / p>

Bloquear cifrados

Desde esta perspectiva de alto nivel, los cifrados de bloque son comparables a RSA de esta manera porque, como su nombre indica, cifran bloques de datos. AES, por ejemplo, hace esto en bloques de 128 bits.

Para permitir que los cifrados de bloques cifren grandes cantidades de datos, se utiliza el denominado "modo de operación" para estandarizar cómo se agrupan los bloques.

Para todos los modos que conozco de la parte superior de mi cabeza, solo necesita bloques de texto sin formato anterior al bloque actual en el texto cifrado para descifrar un bloque en cuestión.

Por lo tanto, con la forma en que interpreto su pregunta para las posibilidades de transmisión, debería ser teóricamente posible transmitir los bloques de texto cifrado de entrada a través de la función de descifrado y hacer que produzca el texto sin formato a medida que se reciben nuevos bloques de texto cifrado.

Conclusión

Entonces, para ser claro: lo que está tratando de hacer ya está estandarizado de facto, depende del modo de operación utilizado para el cifrado de bloque.

Además, ni RSA ni AES ni ningún otro cifrado (cifrado) o cifrado asimétrico están diseñados pensando en la transmisión, y no es necesario que lo sean, ya que son solo bloques de construcción para un esquema mayor, como puede ver de la explicación anterior.

Sin embargo, no generalizaría esto a "esto se puede hacer con todos los cifrados".

Es trivial construir a partir de cualquiera de las tres opciones (cifrado de flujo, cifrado de bloque, cifrado asimétrico) un modo que pone la información necesaria para descifrar el texto cifrado al final del texto cifrado, por lo que es imposible descifrar nada. antes de que estén disponibles los últimos bits del texto cifrado.

    
respondido por el Tobi Nary 18.11.2017 - 07:56
fuente

Lea otras preguntas en las etiquetas