¿Es esta la forma de implementar CTR en un sistema que solo implementa CBC, CFB, CTS, ECB y OFB?

8

La biblioteca de encriptación en mi lenguaje de programación no es compatible con CTR, aunque es compatible con CBC, CFB, CTS, ECB y OFB. Supongo que teóricamente es posible implementar CTR de forma segura en uno de estos otros modos.

Entonces, me pregunto si estas citas describen la implementación correcta de CTR desde una perspectiva de seguridad. Por lo que he leído, creo que sí, pero solo quiero asegurarme de que no me esté perdiendo algo.

  

Estudié un poco más y descubrí que la transformación de bloque para el modo CTR es en realidad el resultado de que XOR'ing el texto sin formato con una transformación AES ECB de un contador que aumenta de forma monotínica. Con ese entendimiento, pude implementar un modo AES CTR con bastante facilidad sobre el modo AES ECB integrado en .NET BCL.

Y,

  

Es posible implementar AES crypto en modo CTR usando la clase AesManaged, aunque requiere un trabajo extra. Para implementar el modo CTR con la clase .NET AesManaged, esto es lo que hice:   Utilice CipherMode.ECB, PaddingMode.None. [No es necesario rellenar en modo CTR porque siempre estamos cifrando un contador de 16 bytes.] Al cifrar, llame a CreateEncryptor (). Usando el ICryptoTransform resultante, para cada bloque, transforme un nonce de 16 bytes (Igual que el tamaño del bloque AES), y luego XOR el resultado de esa transformación con el texto plano para obtener el texto cifrado. Incrementa el nonce después de cada bloque. Continúe hasta que no haya más bloques; no olvide la transformación de bloque final, para el último bloque de 16 bytes o menos.

Por un lado, cuando la cita dice "incremento", ¿qué tipo de incremento debería ser? Seguramente no es lineal?

    
pregunta jnm2 17.06.2011 - 12:47
fuente

1 respuesta

11

Los textos que cita son correctos: el modo CTR es, de hecho, sobre el cifrado de los valores sucesivos de un contador y la XOR sobre el flujo de bytes resultante con los datos para cifrar.

El modo CTR es un modo de operación "aprobado", como el estados NIST . Para el "incremento", puede tratarse de cualquier forma de pasar por los valores de 128 bits que desee (asumo un cifrado de bloque con bloques de 128 bits, como AES), pero si busca interoperabilidad, entonces "the" El modo CTR estándar es el siguiente:

  • El contador es un entero sin signo de 128 bits, es decir, un valor entre 0 y 2 128 -1 .
  • El contador se codifica como una secuencia de 16 bytes utilizando la convención big-endian (el primer byte es el más significativo).
  • El valor inicial (IV) es la codificación big-endian del primer valor del contador; en otras palabras, con AES / CTR, los primeros 16 bytes del texto cifrado son el resultado de la XOR de los primeros 16 bytes del texto plano con el cifrado de la IV (como un bloque de 16 bytes).

Como la mayoría de los lenguajes de programación no tienen valores enteros de 128 bits, el incremento del contador generalmente se realiza byte a byte (comience con el byte 15, auméntelo; si el resultado es 0, hay un carry y usted continúa con el byte 14 , y así sucesivamente; de lo contrario, simplemente detente ahí).

La seguridad del modo

CTR se basa en que nunca tenga el mismo valor de contador que se utilizará dos veces para una clave determinada. Los bloques de 128 bits son un gran espacio; Elegir el IV de forma aleatoria y uniforme es suficiente para garantizar esta política de no reutilización. El uso del modo CTR con un cifrado de bloque que tenga bloques más pequeños (por ejemplo, 3DES y sus bloques de 64 bits) podría ser peligroso, porque el espacio 264 no es tan grande.

Una forma de ver el modo CTR es que convierte un cifrado de bloque en un generador para un largo flujo de bytes pseudoaleatorios; XORIAR este flujo con los datos para cifrar lo convierte en un cifrado de flujo.

    
respondido por el Thomas Pornin 17.06.2011 - 14:30
fuente

Lea otras preguntas en las etiquetas