Descriptografando um bloco de AES

10

Hoje, seu objetivo é descriptografar uma mensagem secreta usando o AES . Dado um texto cifrado e uma chave, você descriptografará e imprimirá a mensagem.


  1. Seu programa pode estar em qualquer idioma. Ele será executado com a entrada stdin e sua saída no stdout será verificada quanto à correção.

  2. A primeira linha de entrada no stdin será a chave de 16 bytes, codificada em hexadecimal. A segunda linha de entrada no stdin será o texto cifrado de 16 bytes, codificado em hexadecimal.

  3. A saída do programa deve ser a mensagem de 16 bytes após descriptografar o texto cifrado usando AES-128 com a chave fornecida. Você deve produzir o resultado interpretado como octetos ASCII. Você pode assumir que qualquer resultado é ASCII válido após descriptografar.

  4. Você não pode usar nenhum recurso de biblioteca / interno que implemente o AES. Você pode usar esses recursos para converter entre codificações hexadecimais / binárias / ASCII.

O menor código em bytes vence.

Exemplo de entrada e saída:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Ataque amanhã.

E outro:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Parabéns.

orlp
fonte
5
... O que é AES?
Alex A.
3
Relacionado
Peter Taylor

Respostas:

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))

ké a chave, cé o texto cifrado. Eu construo P, os poderes de 3 no campo, então S, a caixa de entrada. Em seguida, ké estendido com o cronograma principal. Finalmente, fazemos a descriptografia da AES. Mixcolumns é a fase difícil, todas as outras fases são bem diretas.

Keith Randall
fonte
Talvez você também deve fazer um em Pyth, caso contrário, eu lhe garanto que alguém vai varrer junto e traduzi-lo, batendo você :)
orlp
Como teste rápido, gerei outro caso de teste, mas sua solução falhou. Adicionei o segundo caso de teste à pergunta para que você possa depurar.
Ou orp
@ orip: fixo. Foi um erro multiplicar por zero.
Keith Randall