Decifrare un blocco di AES


10

Oggi il tuo obiettivo è decrittografare un messaggio segreto usando AES . Dato un testo cifrato e una chiave, decifrerai e stamperai il messaggio.


  1. Il tuo programma può essere in qualsiasi lingua. Verrà eseguito con input su stdin e il suo output su stdout verrà verificato per correttezza.

  2. La prima riga di input su stdin sarà la chiave di 16 byte, codificata in esadecimale. La seconda riga di input su stdin sarà il testo cifrato a 16 byte, codificato in esadecimale.

  3. L'output del programma deve essere il messaggio a 16 byte dopo aver decrittografato il testo cifrato usando AES-128 con la chiave fornita. È necessario emettere il risultato interpretato come ottetti ASCII. Si può presumere che qualsiasi risultato sia valido ASCII dopo la decodifica.

  4. Non è possibile utilizzare alcuna libreria / funzionalità integrata che implementa AES. È possibile utilizzare tali funzionalità per convertire tra codifiche esadecimali / binarie / ASCII.

Vince il codice più breve in byte.

Esempio di input e output:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Attacca domani.

E un altro:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Congratulazioni.


5
... Che cos'è AES?
Alex A.


Risposte:


4

Python, 661 caratteri

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è la chiave, cè il testo cifrato. Costruisco P, i poteri di 3 sul campo, quindi Sla casella. Quindi kviene esteso con il programma chiave. Finalmente eseguiamo la decrittazione AES. Mixcolumns è la fase difficile, tutte le altre fasi sono piuttosto semplici.


Forse dovresti fare anche uno in Pyth, altrimenti ti garantirò che qualcuno lo spazzerà e lo tradurrà, battendoti :)
orlp

Come test rapido ho generato un altro testcase, ma la tua soluzione fallisce. Ho aggiunto il secondo testcase alla domanda in modo da poter eseguire il debug.
orlp

@orip: risolto. Era un errore nel moltiplicare per zero.
Keith Randall,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.