ถอดรหัสบล็อกของ AES


10

วันนี้เป้าหมายของคุณคือการถอดรหัสข้อความลับโดยใช้การเข้ารหัส AES ให้รหัสและคีย์คุณจะถอดรหัสและพิมพ์ข้อความ


  1. โปรแกรมของคุณอาจเป็นภาษาใดก็ได้ มันจะถูกรันด้วยอินพุตบน stdin และเอาต์พุตบน stdout จะถูกตรวจสอบความถูกต้อง

  2. บรรทัดแรกของอินพุตบน stdin จะเป็นรหัส 16 ไบต์เข้ารหัสเป็นเลขฐานสิบหก บรรทัดที่สองของอินพุตบน stdin จะเป็นรหัส 16 ไบต์เข้ารหัสในเลขฐานสิบหก

  3. เอาต์พุตของโปรแกรมต้องเป็นข้อความ 16 ไบต์หลังจากถอดรหัส ciphertext โดยใช้ AES-128 พร้อมคีย์ที่กำหนด คุณต้องแสดงผลลัพธ์ที่แปลเป็น octets ASCII คุณอาจสันนิษฐานว่าผลลัพธ์ใด ๆ คือ ASCII ที่ถูกต้องหลังจากถอดรหัส

  4. คุณไม่สามารถใช้คุณลักษณะไลบรารี่ / บิวด์อินที่ใช้ AES ได้ คุณสามารถใช้คุณสมบัติดังกล่าวเพื่อแปลงระหว่างการเข้ารหัสฐานสิบหก / ไบนารี / ASCII

รหัสที่สั้นที่สุดเป็นไบต์ชนะ

ตัวอย่างอินพุตและเอาต์พุต:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

โจมตีพรุ่งนี้

เเละอีกอย่าง:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

ขอแสดงความยินดี


5
... AES คืออะไร
Alex A.

1
@AlexA Advanced Encryption Standard
orlp

คำตอบ:


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คือ ciphertext ฉันสร้าง P พลังของ 3 ในฟิลด์จากนั้นSsbox จากนั้นkจะถูกขยายออกด้วยตารางเวลาที่สำคัญ ในที่สุดเราก็ทำการถอดรหัส AES Mixcolumn คือระยะที่ยากช่วงอื่น ๆ นั้นค่อนข้างตรงไปตรงมา


บางทีคุณควรจะทำอย่างใดอย่างหนึ่งใน Pyth มิฉะนั้นฉันจะรับประกันได้ว่าใครบางคนจะกวาดไปตามและแปลมันเต้นคุณ :)
orlp

จากการทดสอบอย่างรวดเร็วฉันได้สร้างตู้ทดสอบอีกอัน แต่โซลูชันของคุณไม่สำเร็จ ฉันเพิ่มคำถามที่สองลงในคำถามเพื่อให้คุณสามารถดีบักได้
orlp

@orip: แก้ไขแล้ว มันเป็นข้อผิดพลาดในการคูณด้วยศูนย์
Keith Randall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.