Giải mã một khối AES


10

Hôm nay mục tiêu của bạn là giải mã một tin nhắn bí mật bằng AES . Đưa ra một bản mã và khóa, bạn sẽ giải mã và in tin nhắn.


  1. Chương trình của bạn có thể bằng bất kỳ ngôn ngữ nào. Nó sẽ được chạy với đầu vào trên stdin và đầu ra của nó trên thiết bị xuất chuẩn sẽ được kiểm tra tính chính xác.

  2. Dòng đầu tiên trên stdin sẽ là khóa 16 byte, được mã hóa theo hệ thập lục phân. Dòng đầu vào thứ hai trên stdin sẽ là bản mã 16 byte, được mã hóa theo hệ thập lục phân.

  3. Đầu ra của chương trình phải là thông điệp 16 byte sau khi giải mã bản mã bằng AES-128 với khóa đã cho. Bạn phải xuất kết quả được hiểu là các octet ASCII. Bạn có thể cho rằng bất kỳ kết quả nào là hợp lệ ASCII sau khi giải mã.

  4. Bạn không được sử dụng bất kỳ thư viện / tính năng tích hợp nào triển khai AES. Bạn có thể sử dụng các tính năng như vậy để chuyển đổi giữa các bảng mã hex / binary / ASCII.

Mã ngắn nhất trong byte thắng.

Ví dụ đầu vào và đầu ra:

bd8ab53f10b3d38576a1b9a15cf03834
02c0ee126cae50ba938a8b16f0e04d23

Tấn công vào ngày mai.

Và một cái khác:

f4af804ad097ba832906db0deb7569e3
38794338dafcb09d6b32b04357f64d4d

Xin chúc mừng.


5
... AES là gì?
Alex A.


Câu trả lời:


4

Python, 661 ký tự

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

klà chìa khóa, clà bản mã. Tôi xây dựng P, sức mạnh của 3 trong lĩnh vực này, sau đó S, sbox. Sau đó kđược gia hạn với lịch trình quan trọng. Cuối cùng chúng tôi thực hiện giải mã AES. Mixcolumn là giai đoạn khó khăn, tất cả các giai đoạn khác đều khá đơn giản.


Có lẽ bạn cũng nên làm một trong Pyth, nếu không tôi sẽ đảm bảo bạn ai đó sẽ quét dọc và dịch nó, đánh đập bạn :)
orlp

Như một thử nghiệm nhanh, tôi đã tạo ra một testcase khác, nhưng giải pháp của bạn không thành công. Tôi đã thêm testcase thứ hai vào câu hỏi để bạn có thể gỡ lỗi.
orlp

@orip: đã sửa. Đó là một lỗi trong nhân với số không.
Keith Randall
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.