En criptografía , M8 es un cifrador de bloques diseñado por Hitachi en 1999. Es una modificación del algoritmo M6 anterior de Hitachi , diseñado para mayor seguridad y alto rendimiento tanto en hardware como en implementaciones de software de 32 bits. Hitachi registró M8 en marzo de 1999 como ISO/IEC 9979-0020. [ 1 ]
Al igual que M6, M8 es un cifrado Feistel con un tamaño de bloque de 64 bits. La función de ronda puede incluir rotaciones de 32 bits , XOR y suma modular , lo que lo convierte en un ejemplo temprano de un cifrado ARX .
El cifrado presenta un número variable de rondas (cualquier entero positivo N), cada una con una estructura determinada por una " clave de decisión del algoritmo " específica de cada ronda. El hecho de que las rondas dependan de la clave tiene como objetivo dificultar el criptoanálisis (véase FROG para una filosofía de diseño similar).
Descripción del cifrado
El número de rondas puede configurarse con cualquier entero positivo N, pero se recomienda un número de rondas de al menos 10. La clave consta de cuatro componentes: una clave de datos de 64 bits, una clave de expansión de clave de 256 bits, un conjunto de N claves de decisión de algoritmo de 24 bits y un conjunto de N claves de expansión de algoritmo de 96 bits.
La función round se utiliza tanto para la expansión de claves como para el cifrado/descifrado. El proceso de expansión de claves transforma la clave de datos de 64 bits y la clave de expansión de claves de 256 bits en una clave de ejecución de 256 bits, que consta de 4 pares de números de 32 bits..
El cifrado presenta un diseño típico de cifrado Feistel . Primero, el bloque de entrada de 64 bits se divide en dos mitades de 32 bits. En cada ronda, la mitad izquierda sufre una transformación dependiente de la clave y luego se combina con la mitad derecha. Finalmente, las mitades se intercambian. En total, la función de ronda consta de una secuencia de nueve operaciones personalizables y tres rotaciones de bits.
denota el número de ronda, que toma entradasy.son las tres palabras de 32 bits de la clave de expansión del algoritmo de la ronda.son palabras de la clave de ejecución.indica una rotación bit a bit a la izquierda.yse definen mediante la clave de decisión del algoritmo de 24 bits de la siguiente manera:
MSB LSB op1 op2 op3 op4 op5 op6 op7 op8 op9 S1 S2 S3
donde op1 a op9 son cada uno un bit (0 = suma módulo 2 32 , 1 = XOR) y S1 a S3 son cada uno cinco bits.
La expansión de clave consta de ocho rondas de cifrado, utilizando las primeras ocho claves de decisión y expansión del algoritmo, la clave de expansión de clave como clave de ejecución y la clave de datos como bloque de entrada. Las ocho salidas intermedias,se utilizan como los ocho componentes de la clave de ejecución.
Implementación del cifrado
A continuación se muestra una implementación del cifrado en Python .
# https://en.wikipedia.org/wiki/M8_(cipher)M = 0xffffffffdef agregar ( x , y ): return ( x + y ) & Mdef xor ( x , y ): return x ^ ydef rol ( x , s ): return (( x << s ) | ( x >> ( 32 - s ))) & Mdef m8_round ( L , R , ri , k , adk , aek ): """ Una ronda del algoritmo. L, R: entrada ri: índice de ronda k: clave de ejecución de 256 bits adk: clave de decisión del algoritmo de 24 bits aek: clave de expansión del algoritmo de 96 bits """op = [[ add , xor ][( adk >> ( 23 - i )) & 1 ] para i en el rango ( 9 )] S1 = ( adk >> 10 ) & 0x1f S2 = ( adk >> 5 ) & 0x1f S3 = ( adk >> 0 ) & 0x1f A = ( aek >> 64 ) & M B = ( aek >> 32 ) & M C = ( aek >> 0 ) & M KR = ( k >> ( 32 + 64 * ( 3 - ri % 4 ))) & M KL = ( k >> ( 0 + 64 * ( 3 - ri % 4 ))) & Mx = op [ 0 ]( L , KL ) y = op [ 2 ]( op [ 1 ]( rol ( x , S1 ), x ), A ) z = op [ 5 ]( op [ 4 ]( op [ 3 ]( rol ( y , S2 ), y ), B ), KR ) return op [ 8 ]( op [ 7 ]( op [ 6 ]( rol ( z , S3 ), z ), C ), R ), Ldef m8_keyexpand ( dk , kek , adks , aeks ): """ Expansión de clave. dk: clave de datos de 64 bits kek: clave de expansión de clave de 256 bits adks: claves de decisión del algoritmo aeks: claves de expansión del algoritmo """L = ( dk >> 32 ) & M R = ( dk >> 0 ) & M k = 0 para i en rango ( 8 ): L , R = m8_round ( L , R , i , kek , adks [ i ], aeks [ i ]) k |= ( L << ( 32 * ( 7 - i ))) return kdef m8_encrypt ( data , N , dk , kek , adks , aeks ): """ Encripta un bloque con M8. datos: bloque de entrada de 64 bits N: número de rondas (debe ser >= 8) dk: clave de datos de 64 bits kek: clave de expansión de clave de 256 bits adks: una lista de N claves de decisión de algoritmo de 24 bits aeks: una lista de N claves de expansión de algoritmo de 96 bits """ek = m8_keyexpand ( dk , kek , adks , aeks ) L = ( data >> 32 ) & M R = ( data >> 0 ) & M for i in range ( N ): L , R = m8_round ( L , R , i , ek , adks [ i ], aeks [ i ]) return ( L << 32 ) | R# Vector de prueba publicado de ISO/IEC 9979/0020 resultado = m8_encrypt ( 0x0000_0000_0000_0001 , 126 , 0x0123_4567_89AB_CDEF , 0 , [ 0x848B6D , 0x8489BB , 0x84B762 , 0x84EDA2 ] * 32 , [ 0x0000_0001_0000_0000_0000_0000 ] * 126 , ) assert resultado == 0xFE4B_1622_E446_36C0Vectores de prueba
La versión publicada de la norma ISO/IEC 9979-0020 incluye los siguientes datos de prueba:
- Ronda número: 126
- Clave de expansión: 0 256 (un vector compuesto exclusivamente por ceros)
- Clave de datos: 0123 4567 89AB CDEF en hexadecimal
- Clave de decisión del algoritmo:
- rondas 1, 5, 9, ...: 848B6D hexadecimal
- rondas 2, 6, 10, ...: 8489BB hexadecimal
- rondas 3, 7, 11, ...: 84B762 hexadecimal
- rondas 4, 8, 12, ...: 84EDA2 hexadecimal
- Clave de expansión del algoritmo: 0000 0001 0000 0000 0000 0000 hexadecimal para todas las rondas
- Texto plano: 0000 0000 0000 0001 hexadecimal
- Texto cifrado después de 7 rondas: C5D6 FBAD 76AB A53B hexadecimal
- Texto cifrado después de 14 rondas: 6380 4805 68DB 1895 hexadecimal
- Texto cifrado después de 21 rondas: 2BFB 806E 1292 5B18 hexadecimal
- Texto cifrado después de 28 rondas: F610 6A41 88C5 8747 hexadecimal
- Texto cifrado después de 56 rondas: D3E1 66E9 C50A 10A2 hexadecimal
- Texto cifrado final después de 126 rondas: FE4B 1622 E446 36C0 hexadecimal
Criptoanálisis
El comportamiento dependiente de la clave del cifrado da como resultado una gran clase de claves débiles que exponen el cifrado a una variedad de ataques, incluyendo criptoanálisis diferencial , criptoanálisis lineal y criptoanálisis módulo n . [ 2 ]
Referencias
- ↑ "Entrada del registro ISO/IEC9979-0020" (PDF) . Profesor Chris Mitchell, Grupo de Seguridad de la Información, Royal Holloway, Universidad de Londres . Registro ISO/IEC 9979 de algoritmos criptográficos.
- ↑ Toshio Tokita; Tsutomu Matsumoto. "Sobre la aplicabilidad del criptoanálisis diferencial, el criptoanálisis lineal y el criptoanálisis Mod n a un algoritmo de cifrado M8 (ISO9979-20)". Revista Ipsj . 42 (8).
- Cifrados de bloques
- Cifrados de Feistel