Entschlüsseln eines AES-Blocks

10

Heute ist es Ihr Ziel, eine geheime Nachricht mit AES zu entschlüsseln . Mit einem Chiffretext und einem Schlüssel entschlüsseln und drucken Sie die Nachricht.


  1. Ihr Programm kann in einer beliebigen Sprache sein. Es wird mit Eingabe auf stdin ausgeführt und seine Ausgabe auf stdout wird auf Richtigkeit überprüft.

  2. Die erste Eingabezeile in stdin ist der 16-Byte-Schlüssel, der hexadezimal codiert ist. Die zweite Eingabezeile in stdin ist der 16-Byte-Chiffretext, der hexadezimal codiert ist.

  3. Die Ausgabe des Programms muss die 16-Byte-Nachricht sein, nachdem der Chiffretext mit AES-128 mit dem angegebenen Schlüssel entschlüsselt wurde. Sie müssen das als ASCII-Oktett interpretierte Ergebnis ausgeben. Sie können davon ausgehen, dass jedes Ergebnis nach dem Entschlüsseln als ASCII gültig ist.

  4. Sie dürfen keine Bibliothek / integrierten Funktionen verwenden, die AES implementieren. Sie können solche Funktionen verwenden, um zwischen Hex- / Binär- / ASCII-Codierungen zu konvertieren.

Der kürzeste Code in Bytes gewinnt.

Beispiel für Ein- und Ausgabe:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Morgen angreifen.

Und ein anderer:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Herzliche Glückwünsche.

orlp
quelle
5
... Was ist AES?
Alex A.
3
Verwandte
Peter Taylor

Antworten:

4

Python, 661 Zeichen

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

kist der Schlüssel, cist der Chiffretext. Ich baue P, die Potenzen von 3 im Feld, dann Sdie sbox. Dann kwird mit dem Schlüsselplan erweitert. Schließlich führen wir die AES-Entschlüsselung durch. Mixcolumns ist die harte Phase, alle anderen Phasen sind ziemlich einfach.

Keith Randall
quelle
Vielleicht solltest du auch eine in Pyth machen, sonst garantiere ich dir, dass jemand mitfegt und sie übersetzt und dich schlägt :)
orlp
Als schnellen Test habe ich einen weiteren Testfall generiert, aber Ihre Lösung schlägt fehl. Ich habe der Frage den zweiten Testfall hinzugefügt, damit Sie debuggen können.
Orlp
@orip: behoben. Es war ein Fehler beim Multiplizieren mit Null.
Keith Randall