Cómo mejorar el algoritmo de cifrado AES
Los pasos principales del algoritmo de cifrado AES
1.1 Descripción general del algoritmo AES
l Dado un texto sin formato x, inicializa el estado en x, realiza la Operación AddRoundKey y RoundKey se aplica XOR con el estado.
l Para cada una de las rondas Nr-1 anteriores, se utilizan pares de cajas S para operaciones de reemplazo, que se denominan subbytes;; Reemplazar estado, ShiftRows. ; Luego opere en State, MixColumns y luego realice la operación AddRoundKey.
l Ejecute las operaciones SubBytes, ShiftRows y AddRoundKey en secuencia.
l define el estado como texto cifrado y.
1.2 Pseudocódigo
Contraseña (byte de entrada [4*Nb], byte de salida [4*Nb], palabra w[Nb*(Nr+1)])
Inicio
Estado del byte [4, Nb]
Estado = entrada
AddRoundKey(estado, w[0, Nb-1 ]) p>
Para ronda = 1, pasos 1 a Nr-1
Subbytes(estado)
ShiftRows(estado)
Columnas mixtas (estado)
AddRoundKey(estado, w[ronda*Nb, (ronda+1)*Nb-1])
Termina en
Subbyte(estado) p>
ShiftRows(estado)
AddRoundKey(estado, w[Nr*Nb, (Nr+1)*Nb-1])
salida = estado
Fin
2 Implementación de KeyExpansion()
2.1 Requisitos
En el proceso de cifrado, la clave de 128 bits se extiende a 9 rondas, y luego se construye la clave para 11 rondas después de las dos rondas inicial y final. Cada clave de ronda consta de cuatro palabras. Cada palabra consta de cuatro bytes.
2.2 Diseño de algoritmos
Entrada: byte[] clave, byte[] w //key es la clave y w es la clave extendida.
Salida: byte[] w //La longitud de la clave extendida es 4 * 4 * 11.
Transporte:
1) Cree una matriz unidimensional de 4 bytes para almacenar una palabra. byte[]temp;
2) Enviar clave[0.15] a W[0.15]; //Se han asignado 4 palabras a w.
3) Para I = 4 a 43
//Lo siguiente procesa una palabra (32 bits) a la vez
temp = w[I-1 ];
If (I = 0 mod 4) //Procesa una palabra entonces.
j = 1 a 4 //Procesamiento de palabras de 4 bytes
En este bucle, el orden de toma del índice de la matriz temporal es 1, 2, 3, 0 //RotWord operación .
Si es el primer byte de una palabra, toma la constante Rcon Rcon(I/4);
temp[j]= sbox(temp[(j+1)/ 4]constante rcon
Termina en
temp = subword(rotword(temp))⊕rcon[i/4]
Terminará si.. .
w[I]= w[i-4]⊕temp;
Termina en
4) Salida w
3 multiplicación de polinomios Operación módulo GF(28)
3.1 requisitos
Multiplicar los dos bytes en el campo finito GF(28) por el polinomio, módulo el polinomio irreducible m(x)=x8 +x4 +x3+x+1.
3.2 Diseño de algoritmos
Entrada: byte a, byte b
Salida: byte r
Base matemática:
p >Propiedades de los campos finitos de GF(28): la suma de dos elementos es consistente con la suma de dos bytes en modo de bits 2; la multiplicación satisface la ley asociativa;
Considere polinomios Un término en aixi (i∈0-7), multiplica el polinomio por x lineal:
b(x)= b7x 7+b6x 6+b5x 5+B4 x4+b3x 3+B2 x2+ b 1x+B0,
obtener
b7x 8+b6x 7+b5x 6+b4x 5+B3 x4+b2x 3+b 1x 2+B0X (Fórmula 1).
El resultado módulo m(x) se complementa para obtener x*b(x).
Si b7 = 0, entonces la fórmula 1 es x*b(x).
Si b7 no es igual a 0, entonces se debe restar m(x) de la Ecuación 1, y el resultado es x*b(x). Simplemente llama al polinomio multiplicado por x.
Se puede concluir que aixi multiplicado por b(x) se puede multiplicar por I veces. La multiplicación de x (la representación hexadecimal es 0x02) se puede lograr desplazando el byte un bit hacia la izquierda y luego sumándolo al módulo 2 bit a bit de 0x1b. Esta operación se registra temporalmente como xtime (). Al aplicar xtime() repetidamente, se puede lograr una multiplicación de x de orden superior. Cualquier multiplicación se puede implementar usando xtime() agregando resultados intermedios. Por ejemplo:
57 * 13 = fe, esto se debe a que:
57 * 02 = xtime(57) = ae
57 * 04 = xtime( ae ) = 47
57 * 08 = xtime(47) = 8e
57 * 10 = xtime(8e) = 07
Por lo tanto
57 * 13 = 57 * ( 01⊕ 02 ⊕10 )
= 57⊕ ae⊕ 07
=Iron
Sbox de 4ta generación p>
4.1 Requisitos
Considere un byte byte como un polinomio en el campo finito GF (28), encuentre su módulo inverso multiplicativo m (x) y luego coloque el inverso multiplicativo en Realizar una transformación afín en GF(2).
4.2 Diseño de algoritmos
Entrada: byte a
Salida: byte[] S
Lógica matemática:
Según la propiedad del campo finito GF(28). Un generador (también primitivo) A, su A (28-1) ≡ 1 mod m (x). O a255 ≡ 1 mod m(x). Además, las potencias de a de 1 a 28-1 constituyen el campo finito GF (28).
Invierte la propiedad de b * b -1 ≡ 1 mediante multiplicación. Encontrar el recíproco de la multiplicación se puede simplificar de la siguiente manera
Supongamos que x = am, y es el inverso multiplicativo de x, entonces y = a255-m.
Transporte:
Establezca tres matrices, a saber: byte s [255], byte l [255], byte e [255].
Supongamos que la primitiva es a = 0x03,
Envíe la potencia 0, 1, 2...255 de A módulo m(x) a la matriz L respectivamente. La operación de a se refiere a la operación de multiplicación polinomial anterior. El siguiente es un pseudocódigo:
Para i = 0 a 255
L[i] = ai (Fórmula 2)
Termina en
Para facilitar el cálculo del exponente del inverso multiplicativo, la matriz E almacena el exponente de potencia I de ai. Sea el valor de ai en la Ecuación 2 el subíndice de la matriz E, y el subíndice I de ai en la matriz L sea el valor correspondiente en la matriz E. Cada elemento de la Ecuación 2 tiene E[ai] = i.
De las dos matrices L y E anteriores, se puede obtener el inverso multiplicativo de cualquier byte en el dominio GF(28).
Dejemos que ai genere el byte c. donde a es un generador en el dominio GF(28). Para encontrar el inverso multiplicativo de c, simplemente encuentre A255-i. En la matriz E, el exponente de potencia I del generador A se puede encontrar mediante C. El exponente de potencia de c-1 es 255-i. L[255-i].
Para cada byte, el inverso multiplicativo se obtiene de acuerdo con el contenido anterior y la matriz S se obtiene mediante transformación afín.
Es Sbox