解密AES块


10

今天,您的目标是使用AES解密秘密消息。给定密文和密钥,您将解密并打印消息。


  1. 您的程序可以使用任何语言。它将在stdin上使用输入运行,并在stdout上检查其输出是否正确。

  2. stdin输入的第一行将是16字节密钥,以十六进制编码。stdin输入的第二行将是16字节密文,以十六进制编码。

  3. 在使用给定密钥的AES-128解密密文之后,程序的输出必须为16字节消息。您必须输出解释为ASCII八位位组的结果。您可以假定解密后任何结果都是有效的ASCII。

  4. 您不得使用任何实现AES的库/内置功能。您可以使用此类功能在十六进制/二进制/ ASCII编码之间进行转换。

以字节为单位的最短代码获胜。

输入和输出示例:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

明天进攻。

还有一个:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

恭喜你


5
...什么是AES?
Alex A.


Answers:


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是密文。我建立P,在该字段中为3的幂,然后S为sbox。然后k通过关键时间表进行扩展。最后,我们进行AES解密。Mixcolumns是困难的阶段,所有其他阶段都非常简单。


也许您也应该在Pyth中做一个,否则,我保证您会有人扫过并翻译它,击败您:)
orlp 2015年

作为快速测试,我生成了另一个测试用例,但是您的解决方案为此失败。我在问题中添加了第二个测试用例,以便您可以调试。
orlp 2015年

@orip:固定。乘以零是一个错误。
基思·兰德尔2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.