AESのブロックの復号化


10

今日の目標は、AESを使用して秘密のメッセージを解読することです。暗号文とキーを指定すると、メッセージを復号化して印刷します。


  1. プログラムはどの言語でもかまいません。stdinの入力で実行され、stdoutの出力が正しいかどうかがチェックされます。

  2. stdinの入力の最初の行は、16バイトでエンコードされた16バイトのキーになります。stdinの入力の2行目は、16バイトでエンコードされた16バイトの暗号文です。

  3. プログラムの出力は、指定された鍵でAES-128を使用して暗号文を復号化した後の16バイトメッセージでなければなりません。ASCIIオクテットとして解釈された結果を出力する必要があります。解読後の結果はすべて有効なASCIIであると想定できます。

  4. AESを実装するライブラリ/組み込み機能を使用することはできません。このような機能を使用して、hex / binary / ASCIIエンコーディング間で変換できます。

バイト単位の最短コードが優先されます。

入力と出力の例:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

明日攻撃する。

そしてもう一つ:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

おめでとう。


5
... AESとは
Alex A.


回答:


4

Python、661文字

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は鍵でcあり、暗号文です。私はフィールドで3の累乗であるPをビルドし、次にSsboxをビルドします。次にk、キースケジュールで拡張されます。最後に、AES復号化を行います。Mixcolumnsは難しいフェーズですが、他のすべてのフェーズはかなり単純です。


たぶん、あなたもPythで行うべきでしょう。それ以外の場合は、誰かがそれに沿って
一斉に

簡単なテストとして別のテストケースを生成しましたが、ソリューションは失敗しました。デバッグできるように、2つ目のテストケースを質問に追加しました。
orlp 2015年

@orip:修正されました。これはゼロを掛ける際のバグでした。
キースランドール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.