Mendekripsi blok AES

10

Hari ini tujuan Anda adalah mendekripsi pesan rahasia menggunakan AES . Diberikan ciphertext dan kunci Anda akan mendekripsi dan mencetak pesan.


  1. Program Anda mungkin dalam bahasa apa pun. Ini akan dijalankan dengan input pada stdin, dan outputnya pada stdout akan diperiksa kebenarannya.

  2. Baris input pertama pada stdin adalah kunci 16 byte, yang dikodekan dalam heksadesimal. Baris input kedua pada stdin adalah ciphertext 16 byte, yang dikodekan dalam heksadesimal.

  3. Output dari program harus berupa pesan 16 byte setelah mendekripsi ciphertext menggunakan AES-128 dengan kunci yang diberikan. Anda harus menampilkan hasil yang ditafsirkan sebagai oktet ASCII. Anda dapat berasumsi bahwa hasil apa pun adalah ASCII yang valid setelah didekripsi.

  4. Anda tidak boleh menggunakan pustaka / fitur bawaan apa pun yang menerapkan AES. Anda dapat menggunakan fitur tersebut untuk mengkonversi antara pengkodean hex / binary / ASCII.

Kode terpendek dalam byte menang.

Contoh input dan output:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Serang besok.

Dan satu lagi:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Selamat.

orlp
sumber
5
... Apa itu AES?
Alex A.
1
@AlexA. Standar Enkripsi Lanjut .
orlp
3
Terkait
Peter Taylor

Jawaban:

4

Python, 661 karakter

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

kadalah kuncinya, cadalah ciphertext. Saya membangun P, kekuatan 3 di bidang, lalu S, kotak itu. Kemudian kdiperpanjang dengan jadwal kunci. Akhirnya kami melakukan dekripsi AES. Mixcolumns adalah fase yang sulit, semua fase lainnya cukup mudah.

Keith Randall
sumber
Mungkin Anda juga harus melakukan satu di Pyth, kalau tidak saya jamin seseorang akan menyapu dan menerjemahkannya, memukuli Anda :)
orlp
Sebagai tes cepat saya membuat testcase lain, tetapi solusi Anda gagal untuk itu. Saya menambahkan testcase kedua ke pertanyaan sehingga Anda dapat men-debug.
orlp
@orip: diperbaiki. Itu adalah bug dalam mengalikan dengan nol.
Keith Randall