¿El endianness utilizado con un algoritmo de cifrado afecta su seguridad?

7

Estoy implementando el cifrado de bloques AES, que lee / escribe datos en bloques de 16 bytes. La implementación con la que estoy trabajando generalmente lee datos en el formato little endian. Pero en mi plataforma, el endianness que estoy usando es "orden de la red" big endian. ¿Puedo usar BE para el algoritmo de encriptación? ¿La endianness cambia generalmente la forma en que funciona el algoritmo? ¿Importa en absoluto? Asumí que no, ya que podría haber sido simplemente datos diferentes que está leyendo.

    
pregunta Robinicks 07.04.2012 - 14:00
fuente

3 respuestas

6

Primero, asegurémonos de obtener endianness:

// needs a C99 compiler like gcc. Will work with msvc as well.
#include <stdint.h>
#include <stdio.h>

union endian_test
{
    struct 
    {
        uint8_t a;
        uint8_t b;
        uint8_t c;
        uint8_t d;
    };
    uint32_t x;
};


int main(int argc, char** argv)
{
    union endian_test e;
    e.x = 0xAABBCCDD;
    printf("%x %x %x %x", e.a, e.b, e.c, e.d);
}

Si tu sistema es little endian, obtendrás DD CC BB AA como salida y big endian te dará lo contrario. Todo lo que estamos haciendo aquí es permitirle al procesador la oportunidad de representar un número entero en cualquier endianness que use, y luego usar un pequeño truco de C para generar los bytes en el orden en que están representados en la memoria.

AES funciona en bloques de 128 bits, lo que es realmente conveniente, ya que si multiplicas todos los tamaños de campo en esa unión por cuatro, obtendrás un bloque de entrada AES.

Así que ahora tu pregunta se reduce a:

  

Si tuviera que invertir el orden de entrada de mi bloque, ¿eso crearía un problema de seguridad?

Bueno, eso depende de la salida. Supongamos que algo ingenuo, como invertir el orden de la entrada, produce un texto cifrado invertido, entonces si la entrada es AABBCCDD que se cifra a 12345678 y DDCCBBAA se cifra a 78563412.

Este es un problema para una cierta clase de vulnerabilidad criptográfica llamada CCA2 , o un ataque de texto cifrado adaptativo elegido. Como resultado del hecho de que el texto cifrado es maleable , puede solicitar que se realicen varias operaciones de descifrado y mientras Usted no sabe el texto en claro, podría deducir algo al respecto. Le gustaría leer un poco en indistinguishability del texto cifrado .

Como tal, un esquema criptográfico no debería verse afectado por la endianidad. Si es, o es maleable, tiene algunos problemas de seguridad que pueden ser abordados (y son, en algunas implementaciones, por ejemplo, al no proporcionar un oráculo de descifrado).

    
respondido por el user2213 07.04.2012 - 23:04
fuente
1

El AES se define como operando en bloques de 16 bytes. Dicho bloque es una secuencia de bytes ordenada : hay un primer byte, un segundo byte, etc., hasta el decimosexto byte. A menudo decimos que el primer byte es el extremo izquierdo y el último byte el derecho porque somos occidentales que usamos un alfabeto latino y escribimos de izquierda a derecha, y simplemente lo hacemos ciegamente. Supongamos implícitamente que las personas que escriben de derecha a izquierda están simplemente equivocadas.

Endianness se trata de interpretar una secuencia de bytes como un valor entero; por ejemplo, una secuencia de cuatro bytes, interpretada como un número entero entre 0 y 4294967295. Para hacer tal interpretación, decidimos que uno de los bytes es para las unidades (multiplicamos su valor numérico por 1), otro se debe multiplicar por 256, otro por 65536 (que es 256 * 256), y otro por 16777216 (es decir, 256 * 256 * 256). convención Little-endian es cuando el byte para unidades aparece primero, seguido del byte de valor 256, luego el byte de valor 65536 y, finalmente, el byte de valor 16777216. convención de Big-Endian es cuando los bytes están en el orden opuesto.

Dentro de AES, no hay interpretación de secuencias de bytes en enteros más grandes, por lo que no se aplica la endianidad. Sin embargo, incluso para los algoritmos que do implican la interpretación de secuencias de bytes en enteros, la especificación del algoritmo define la endianness a utilizar. Luego, depende de la implementación seguir esa convención definida, ya sea que coincida con lo que la CPU hace mejor o no. Por ejemplo, en la función de hash MD5 , el mensaje de entrada (una secuencia de bytes), después del relleno, se divide en 64 -los bloques de bytes, y cada bloque se divide en 16 secuencias de 4 bytes, y cada secuencia se interpreta como un entero con la convención little-endian . MD5 es MD5; es determinista y su salida para un archivo de entrada determinado no debe depender de si la computadora utiliza una CPU x86, ARM, PowerPC o Sparc. Por lo tanto, las implementaciones que se ejecutan en la CPU big-endian deben incluir los pasos necesarios de intercambio de bytes para realizar el cálculo correctamente.

Tres puntos adicionales:

  • La importancia de la endianidad para el rendimiento está sobrevaluada. Incluso para MD5, que es muy rápido (en mi computadora, procesa más de 400 megabytes por segundo), el intercambio de bytes para la CPU big-endian implica una sobrecarga de no más del 15%. Esta es la razón por la que las funciones hash SHA-1 / SHA-256 habituales pueden usar la convención big-endian (así es como se definieron), al contrario de lo que hace una PC básica de forma nativa, y todavía no es un gran problema.

  • Si su código C debe ser consciente de la endianidad, entonces hace las cosas mal. El código C que no es endian neutral es un código C que accede a los mismos objetos de memoria que los grupos de bytes enteros y . Dichos códigos se rompen reglas estrictas de alias , lo que significa que el código puede dejar de funcionar correctamente cuando se compila con una versión de compilador diferente o con diferentes opciones de compilador. Esta es una programación descuidada.

  • Además de little-endian y big-endian, han existido otras convenciones, a menudo llamadas mixed-endian . Estos han desaparecido en su mayoría. Sin embargo, las arquitecturas big-endian y little-endian todavía están prosperando, por lo tanto, solo para la portabilidad, el código debe ser endian neutral.

respondido por el Thomas Pornin 27.09.2012 - 00:30
fuente
0

AES trabaja en secuencias de bytes. Lo primero que debe hacer es convertir los bytes al orden de bytes canónico, luego puede hacer el descifrado. La criptografía se debe hacer en la aplicación, con los datos de la aplicación. En otras palabras, debe corregir el orden de bytes en una capa inferior de abstracción que la criptografía.

    
respondido por el D.W. 07.04.2012 - 22:16
fuente

Lea otras preguntas en las etiquetas