Déchiffrer un bloc d'AES

10

Aujourd'hui, votre objectif est de décrypter un message secret à l'aide d' AES . Étant donné un texte chiffré et une clé, vous déchiffrerez et imprimerez le message.


  1. Votre programme peut être dans n'importe quelle langue. Il sera exécuté avec une entrée sur stdin et sa sortie sur stdout sera vérifiée pour son exactitude.

  2. La première ligne d'entrée sur stdin sera la clé de 16 octets, codée en hexadécimal. La deuxième ligne d'entrée sur stdin sera le texte chiffré de 16 octets, codé en hexadécimal.

  3. La sortie du programme doit être le message de 16 octets après déchiffrement du texte chiffré en utilisant AES-128 avec la clé donnée. Vous devez sortir le résultat interprété comme des octets ASCII. Vous pouvez supposer que tout résultat est ASCII valide après le décryptage.

  4. Vous ne pouvez pas utiliser de bibliothèque / fonctionnalités intégrées qui implémentent AES. Vous pouvez utiliser ces fonctionnalités pour convertir entre les encodages hexadécimaux / binaires / ASCII.

Le code le plus court en octets gagne.

Exemple d'entrée et de sortie:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Attaque demain.

Et un autre:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Toutes nos félicitations.

orlp
la source
5
... Qu'est-ce que l'AES?
Alex A.
1
@AlexA. Advanced Encryption Standard .
orlp
3
En relation
Peter Taylor

Réponses:

4

Python, 661 caractères

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

kest la clé, cest le texte chiffré. Je construis P, les pouvoirs de 3 sur le terrain, puis S, la sbox. kEst ensuite étendu avec le calendrier clé. Enfin, nous faisons le déchiffrement AES. Mixcolumns est la phase difficile, toutes les autres phases sont assez simples.

Keith Randall
la source
Peut-être que vous devriez aussi en faire un en Pyth, sinon je vous garantis que quelqu'un vous accompagnera et le traduira, vous battant :)
orlp
Comme test rapide, j'ai généré un autre testcase, mais votre solution échoue. J'ai ajouté le deuxième testcase à la question pour que vous puissiez déboguer.
orlp
@orip: fixe. C'était un bug à multiplier par zéro.
Keith Randall