Deszyfrowanie bloku AES

10

Dzisiaj Twoim celem jest odszyfrowanie tajnej wiadomości za pomocą AES . Biorąc pod uwagę zaszyfrowany tekst i klucz, odszyfrujesz i wydrukujesz wiadomość.


  1. Twój program może być w dowolnym języku. Zostanie uruchomiony z wejściem na stdin, a jego wyjście na stdout zostanie sprawdzone pod kątem poprawności.

  2. Pierwszym wierszem wejścia na stdin będzie 16-bajtowy klucz zakodowany w systemie szesnastkowym. Drugim wierszem wejścia na stdin będzie 16-bajtowy tekst zaszyfrowany, zapisany w systemie szesnastkowym.

  3. Wyjście programu musi być 16-bajtowym komunikatem po odszyfrowaniu tekstu zaszyfrowanego za pomocą AES-128 z danym kluczem. Wynik należy interpretować jako oktety ASCII. Możesz założyć, że każdy wynik jest prawidłowy ASCII po odszyfrowaniu.

  4. Nie możesz używać żadnych bibliotek / wbudowanych funkcji, które implementują AES. Możesz użyć takich funkcji do konwersji między kodowaniem szesnastkowym / binarnym / ASCII.

Najkrótszy kod w bajtach wygrywa.

Przykładowe dane wejściowe i wyjściowe:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Zaatakuj jutro.

I kolejny:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Gratulacje.

orlp
źródło
5
... Co to jest AES?
Alex A.
3
Powiązane
Peter Taylor

Odpowiedzi:

4

Python, 661 znaków

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

kjest kluczem, cjest zaszyfrowanym tekstem. SBuduję P, potęgi 3 w terenie, a następnie sbox. Następnie kzostaje przedłużony o kluczowy harmonogram. Wreszcie dokonujemy deszyfrowania AES. Mixkolumny to faza trudna, wszystkie pozostałe fazy są dość proste.

Keith Randall
źródło
Może powinieneś także zrobić jeden w Pyth, w przeciwnym razie gwarantuję, że ktoś się przetoczy i przetłumaczy, bijąc cię :)
lub
Jako szybki test wygenerowałem kolejną próbę testową, ale twoje rozwiązanie zawiedzie. Do pytania dodałem drugą walizkę testową, abyś mógł debugować.
orlp
@orip: naprawiono. Błędem było pomnożenie przez zero.
Keith Randall