Síntesis hardware del criptoalgoritmo IDEA . IDEA es un algoritmo de cifrado de datos de bloques simétricos . Para 2019, IDEA es un algoritmo de encriptación confiable debido a la falta de ataques criptoanalíticos lineales exitosos . Su uso en aplicaciones críticas como las militares o el uso en el paquete de software de encriptación PGP requiere una implementación de hardware eficiente, altamente segura y correcta.
B. Schneier [1] y A. Tanenbaum [2] consideran que IDEA es uno de los algoritmos criptográficos más seguros disponibles. De hecho, no hay ataques criptoanalíticos lineales exitosos en IDEA, y no hay debilidades algebraicas conocidas en IDEA que no sean las descubiertas por J Daemen [3] . Yoan Dimen llevó a cabo el ataque utilizando una clase de 251 claves débiles durante el cifrado, lo que facilita el descubrimiento y la recuperación de la clave. Sin embargo, dado que hay una gran cantidad de claves posibles, este resultado no afecta la seguridad práctica del cifrado para el cifrado proporcionado.
La implementación de hardware de este algoritmo criptográfico ha sido un área de desarrollo activo.
A continuación se muestran las implementaciones más comunes:
Presentó la implementación del núcleo FPGA para IDEA [4] . Usaron un sistema con un módulo de un solo núcleo para implementar IDEA, que se hizo usando un Xilinx FPGA .
Se investigó una implementación de alto rendimiento de IDEA usando arquitecturas paralelas y seriales [6] . Utilizaron los FPGA Xilinx Virtex XCV300-6 y XCV1000-6 para la evaluación y el análisis del rendimiento.
La referencia [7] presentó una comparación de la implementación de IDEA entre las computadoras de propósito general SRC-6E y HC-36.
La siguiente implementación es obra de Ali E. Abdallah e Issam W. Damaj [8] .
Aclaración: una secuencia es un método para pasar valores secuencialmente. Implica una secuencia de mensajes en un canal, donde cada mensaje representa un valor diferente. Suponiendo que el flujo finaliza, después de que se haya transmitido el último valor, se informará un final de transmisión (EOT).
Considere el algoritmo IDEA como tres bloques principales. Una vista global de estos bloques mostraría el cifrado (o descifrado) como un bloque con 2 entradas, una clave privada y texto sin formato (o texto cifrado) y una salida de texto cifrado (o texto sin formato). Los dos bloques restantes son la generación de las subsecciones de cifrado y descifrado. En el caso de generar subsecciones de cifrado, el bloque aceptará claves privadas entrantes y salientes de las subsecciones deseadas. El generador de subclaves de descifrado inyectará las subclaves de cifrado generadas y las claves de descifrado de salida. Definamos algunos tipos que se usarán en la siguiente especificación (El siguiente código está escrito en HDL ):
escriba Private = [ Bool ] escriba SubKey = Int escriba Plaintext = [ Int ] escriba Ciphertext = [ Int ] modVal = 65536• Suma de enteros de 16 bits módulo 65536 ( )
• Multiplicar enteros de 16 bits módulo 65537 ( ), donde el bloque completo de ceros de entrada se trata como .
Se generan 52 subclaves de 16 bits a partir de una clave de cifrado de 128 bits. El algoritmo de generación es el siguiente:
• Las primeras ocho subclaves se seleccionan directamente de la clave dividiendo la clave (lista de 128 bits) en ocho segmentos de igual longitud (16 bits)
• Se aplica un desplazamiento circular de posiciones de 25 bits. a la clave del paso anterior, y luego se extraen ocho subclaves.
• Este procedimiento se repite hasta que se hayan generado las 52 subclaves, es decir, 8 veces y 4 claves dedicadas en la etapa final.
En la siguiente especificación, la generación de subclaves es la función generateEncSubKeys, esta función toma una clave de cifrado como entrada y genera una lista de 52 subclaves de 16 bits. Genera las subclaves correspondientes para cada turno usando la función generateSubKeys. Las claves generadas luego se combinan en una lista. Luego, las 52 subclaves se extraen de la lista y se convierten en números enteros equivalentes a la lista bool de 16 elementos que representa cada subclave. La conversión se realiza mediante la función btoi:
generarEncSubKeys :: Privado -> [ Subclave ] generarEncSubKeys clave = mapa ( btoi ) ( tomar 52 ( foldr1 ( ++ ) ( mapa generarSubclaves ( tomar 8 ( keyRotation clave ) ))))Todas las claves desplazadas están determinadas por la función keyRotation, que las genera repetidamente. Esta función usa una función polimórfica repetitiva que toma una función f y una lista de xs y aplica repetidamente la función f a xs. En este caso, devuelve repetidamente la clave en incrementos de 25 bits. Por tanto, los valores serán 0, 25, 50, 75, 100, 125:
keyRotation :: Private -> Bool keyRotation clave = toma 8 ( tecla repetida ( shift 25 ) ) repetida :: ( a -> a ) -> a -> [ a ] repetida fx = x: repetida f ( f x ) shift : : Int -> [ a ] -> [ a ] shift n tecla = ( soltar tecla n ) ++ ( tomar tecla n )Para generar subclaves de 16 bits a partir de las claves modificadas, aplique la función generateEncSubKeys a la función generateSubKeys en la lista de claves modificadas. La función generateSubKeys usa segs, que selecciona n sublistas de una lista xs:
generarSubclaves :: Privado -> [ Subclave ] generarSubclaves clave = segs 16 segs clave :: Int -> [ a ] -> a segs n [] = [] segs n xs = ( tomar n xs ) : segs n ( soltar nxs ) _Finalmente, las subclaves requeridas se empaquetan en listas de 6 elementos en uno utilizando un paquete de funciones:
paquete :: [ a ] -> un paquete = segs 6Después de generar el cifrado, considere generar el descifrado, donde cada subsección de descifrado es una función de una de las subsecciones de cifrado. La relación entre las claves de cifrado y descifrado se define en la función generateDecSubKeys. Esta función se realiza asignando la función a una lista de índice preparada. La función de ejecución utiliza addInv y mulInv, que corresponden al inverso aditivo y multiplicativo, respectivamente. Esta función también usa funciones de orden superior que toman una lista de funciones y una lista de valores y aplican (usando la función de aplicación) cada función en la primera lista al valor correspondiente en la segunda lista (usando la función de orden superior zipWith) :
generarDecSubKeys :: [ Subclave ] -> [ Subclave ] generarDecSubKeys eKeys = tomar 52 ( foldr1 ( ++ ) ( map perform indices )) where indices = mapWith fs ( map reverse ( pack ( reverse [ l | l <- [ 0.. 51 ]]))) f1 ( xs ) = shift 2 xs f2 ( xs ) = zipWith ( + ) ( copiar ( xs !! 2 ) 6 ) [ 0 , 2 , 1 , 3 , - 2 , - 1 ] f3 = idfs = [ f1 , f2 , f2 , f2 , f2 , f2 , f2 , f2 , f3 ] perform ( as ) = mapWith [ mulInv , addInv , addInv , mulInv , id , id ]( zipWith ( !! ) ( copiar eKeys 6 ) as ) copiar :: a -> Int -> [ a ] copiar x n = [ x | yo <- [ 1. . n ]] mapWith :: [( a -> b )] -> [ a ] -> [ b ] mapWith fs = zipWith ( aplicar ) fs aplicar :: ( a -> b ) -> a -> b aplicar f = fDefinimos una operación aritmética inversa aditiva (módulo ) y una operación aritmética inversa multiplicativa (módulo ), estas operaciones son las funciones addInv y mulInv. La función addInv simplemente ingresa un número para restar del valor del módulo:
addInv :: Int -> Int addInv a = modVal - aPara calcular la operación aritmética inversa multiplicativa se utiliza el algoritmo euclidiano extendido [9] . La especificación funcional se ve así:
mulInv :: Int -> IntmulInv 0 = 0 mulInv b = si ( y < 0 ) entonces (( modVal + 1 ) + y ) else ( y ) donde y = ( extendedEucA ( modVal + 1 ) b ) !! 2 extendedEucA :: Int -> Int -> [ Int ] extendedEucA a b | segundo == 0 = [ un , 1 , 0 ] | de lo contrario = iterarPasos [ a , b , 0 , 1 , 1 , 0 ] iterarPasos ls = si (( ls [ 1 ]) > 0 ) entonces ( iterarPasos s2 ) else ([( ls [ 0 ]), ( ls [ 3 ] ), ( ls [ 5 ])]) donde s1 = ( paso1 ls ) s2 = ( paso2 [( ls [ 1 ]), ( s1 [ 1 ]), ( ls [ 2 ]), ( s1 [ 2 ]), ( ls [ 4 ]), ( s1 [ 3 ])]) paso1 :: [ Int ] -> [ Int ] paso1 ls1 = [ q , ( ls1 [ 0 ]) - ( q * ( ls1 [ 1 ])), ( ls1 [ 3 ]) - ( q * ( ls1 [ 2 ])), ( ls1 [ 5 ]) - ( q * ( ls1 [ 4 ]))] donde q = div ( ls1 [ 0 ]) ( ls1 [ 1 ]) paso2 :: [ Int ] -> [ Int ] paso2 ls1 = [( ls1 [ 0 ]), ( ls1 [ 1 ]), ( ls1 [ 3 ]), ( ls1 [ 2 ]), ( ls1 [ 5 ] ), ( ls1 [ 4 ])]Los resultados de varias construcciones de cifrado (descifrado) reflejan el cambio en el rendimiento. La primera prueba es la más rápida con un rendimiento máximo de 21,33 Gbps (rendimiento promedio de 21,5 Mbps) observado al probar vectores de entrada aleatorios con clave = {1, 2, 3, 4, 5, 6, 7, ocho}. La segunda prueba, que corresponde a la ejecución secuencial de rondas, tiene el rendimiento más lento esperado (rendimiento máximo de 5,82 Gbps y rendimiento promedio de 19,53 Mbps). Vale la pena señalar que las diferentes implementaciones de operaciones aritméticas modulares afectan significativamente el rendimiento de IDEA.
La implementación que usa Xilinx FPGA (Davor Runje y Mario Kovač) es muy inferior en rendimiento, esto también se debe al uso de una fuente de alimentación separada en las ranuras PCI (las líneas de alimentación de E/S y la lógica principal de las tarjetas de expansión están separadas para evitar daños al controlador).
KH Tsoi, PHW Leong presentó una implementación de más alto rendimiento basada en el FPGA Xilinx Virtex XCV300-6. Pero nuevamente, el rendimiento no estuvo en el nivel más alto y se retrasó con respecto a la implementación de Ali E. Abdallah e Issam W. Damaj en un orden de magnitud de MHz, mientras que la implementación en serie de bits ofrece 600 Mbps a 150 MHz. El rendimiento calculado de las implementaciones de bits en paralelo y bits en serie en el dispositivo XCV1000-6 es de 5,25 Gb/s y 2,40 Gb/s, respectivamente [10] .
Allen Michalski, Kris Gaj y Tarek El-Ghazawi obtuvieron resultados de 2,5 MB/s: rendimiento de procesamiento de Crypto++. La velocidad de procesamiento del hardware de la plataforma SRC es 18,5 veces más rápida para matrices de datos individuales y unas 24 veces más rápida para un flujo continuo de matrices.