2010-08-09 17 views
6

Voy a hacer una breve historia corta. Ha pasado un tiempo que deseo implementar mi propio programa de cifrado/descifrado AES. El programa de cifrado funcionó bien y se encriptaron sin ningún error ni salida extraña (ya que comparé la salida de mi programa con una comercial y el resultado fue el mismo).Algoritmo de descifrado AES

Wikipedia fue (es) mi guía en esta implementación en la que leí "Se aplica un conjunto de rondas inversas para transformar el texto cifrado en el texto original utilizando la misma clave de cifrado".

Hay un par de módulos que he implementado:

  1. Añadir redonda clave
  2. filas Shift
  3. Sub bytes
  4. mezcla Columna

Me pareja también implementado de aplicación inversa de los módulos anteriores:

  1. filas de desplazamiento de retroceso
  2. inversa Sub Byte
  3. mezcla inversa Columna

NOTA: Yo no implementaron clave de ciclo inverso, ya que, Es XOR ing el texto plano con la clave de cifrado, y reverso de XOR es en sí XOR (corríjanme si me equivoco)

Así que putts estos módulos en el orden inverso al que hice cifrado, pero nunca llegó a mis texto plano posterior:

expandkey128(key); 
rev_subbytes(data); 
rev_shiftrows(data); 
addroundkey(data,key,10); 

for(int i = 9; i>= 1; i--) { 
    rev_subbytes(data); 
    rev_shiftrows(data); 
    rev_mixColum(data); 
    addroundkey(data,key,i); 
} 

addroundkey(data,key,0); 

// Please note that I also did from 0 to 10 , 
// instead of 10 to 0 and didn't workout 

Y también pensé, tal vez no debería implementar el modelo inverso de los módulos, tal vez tenga que usar esos módulos con los que hice el cifrado, solo en orden inverso; ¿bien adivina que? no funcionó! :

expandkey128(key); 
addroundkey(data,key,0); 

for(int i = 1; i<= 9; i++) { 
    subbytes(data); 
    shiftrows(data); 
    mixColum(data); 
    addroundkey(data,key,i); 
} 

subbytes(data); 
shiftrows(data); 
addroundkey(data,key,10); 

Así que aquí está la pregunta: ¿qué pasa? || ¿cuál es la secuencia correcta de aplicación de estos llamados módulos o funciones si se quiere?

+1

¿ha calculado correctamente su s-box, porque no puede usar la misma que está utilizando para el cifrado? http://en.wikipedia.org/wiki/S-box Este comentario falta en la versión en inglés en wikipedia. eche un vistazo a la especificación directamente: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf. Usted debe calcular el s-box inverso para descifrar. – evildead

+0

Sí en realidad en rev_subbytes Tengo S-box inverso de Rijndael –

+1

hay una gran herramienta de allí: http://www.cryptool.de/ En eso puedes hacer cualquier transformación a mano.Tal vez deba depurar cada paso, tal vez la herramienta lo ayude con eso para verificar cada paso. – evildead

Respuesta

7

Su orden de operaciones parece incorrecto. Creo que quieres esto:

expandkey128(key); 

addroundkey(data,key,10); 
rev_shiftrows(data); 
rev_subbytes(data); 

for(int i = 9; i>= 1; i--) { 
    addroundkey(data,key,i); 
    rev_mixColumn(data); 
    rev_shiftrows(data); 
    rev_subbytes(data); 
} 

addroundkey(data,key,0); 

Para más detalles, ver my stick figure explanation of AES con su implementación de referencia que acompaña.

ADVERTENCIA: Como se mencionó en Act 3, Scene 2, there be dragons por escrito su propia implementación AES para su uso en producción.

+0

No usaría una implementación propia para aes tampoco. Acuerdo de Niza;) – evildead

+0

Bueno, no voy a usarlo en ningún lado, ¡era solo por diversión! y probé su orden que no funcionó, también revisé el enlace (http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf), dice pedido diferente –

+1

Funciona en mi máquina y en mi implementación :). Si tiene algo de tiempo, descargue mi implementación de C# y piérela y compare cada paso con su implementación. Tenga en cuenta que el orden que di es efectivamente el mismo que en la Figura 12. Simplemente lo prefiero en el orden que di para dejar en claro que está invirtiendo todo. Me tomó algunos ensayos comparar mi producción con la salida de ronda por ronda del libro de Rijndael para asegurarme de que tenía las cosas correctas. Es posible que simplemente tenga un pequeño error en una de sus funciones inversas. Recomiendo ir despacio sobre cada ronda como su siguiente paso. –

Cuestiones relacionadas