Descifrar un bloque de AES

10

Hoy su objetivo es descifrar un mensaje secreto usando AES . Dado un texto cifrado y una clave, descifrará e imprimirá el mensaje.


  1. Su programa puede estar en cualquier idioma. Se ejecutará con entrada en stdin, y su salida en stdout se verificará para su corrección.

  2. La primera línea de entrada en stdin será la clave de 16 bytes, codificada en hexadecimal. La segunda línea de entrada en stdin será el texto cifrado de 16 bytes, codificado en hexadecimal.

  3. La salida del programa debe ser el mensaje de 16 bytes después de descifrar el texto cifrado usando AES-128 con la clave dada. Debe generar el resultado interpretado como octetos ASCII. Puede suponer que cualquier resultado es ASCII válido después de descifrarlo.

  4. No puede usar ninguna biblioteca / características integradas que implementen AES. Puede usar tales funciones para convertir entre codificaciones hexadecimales / binarias / ASCII.

El código más corto en bytes gana.

Ejemplo de entrada y salida:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Ataque mañana.

Y otro:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Felicidades.

orlp
fuente
55
... ¿Qué es AES?
Alex A.
3
Relacionado
Peter Taylor

Respuestas:

4

Python, 661 caracteres

R=range
I=lambda x:[int(x[2*i:2*i+2],16)for i in R(16)]
k=I(raw_input())
c=I(raw_input())
P=[]
x=1
for i in R(512):P+=[x];x^=x*2^(x>>7)*0x11b
S=[255&(99^j^(j>>4)^(j>>5)^(j>>6)^(j>>7))for i in R(256)for j in[(P[255-P.index(i)]if i else 0)*257]]
for r in R(10):
 for i in R(4):k+=[k[-16]^S[k[-3-(i>2)*4]]]
 k[-4]^=[1,2,4,8,16,32,64,128,27,54][r]
 for i in R(12):k+=[k[-16]^k[-4]]
for r in R(11):
 c=[x^y for x,y in zip(k[160-16*r:],c)]
 if r>9:break
 for i in[0,4,8,12]*(r>0):c[i:i+4]=[x^y^z^w for j in R(4)for x,y,z,w in[[P[a+P.index(v)]if v else 0 for a,v in zip((2*[104,238,199,223])[3-j:],c[i:i+4])]]]
 c=(c*13)[::13];c=map(S.index,c)
print''.join(map(chr,c))

kes la clave, ces el texto cifrado. Construyo P, los poderes de 3 en el campo, luego S, el sbox. Luego kse extiende con el horario clave. Finalmente hacemos el descifrado AES. Mixcolumns es la fase difícil, todas las otras fases son bastante sencillas.

Keith Randall
fuente
Tal vez también deberías hacer uno en Pyth, de lo contrario te garantizo que alguien barrerá y traducirá, golpeándote :)
orlp
Como prueba rápida, generé otro caso de prueba, pero su solución falla. Agregué el segundo caso de prueba a la pregunta para que pueda depurar.
orlp
@orip: arreglado. Fue un error al multiplicar por cero.
Keith Randall