Theo tinh thần của Cuộc thi C Underhanded , tôi đang bắt đầu Cuộc thi Code Underhanded. Mục tiêu của cuộc thi này là đơn giản thực hiện một số mã, trong khi khéo léo che giấu một lỗi bất chính bên trong nó.
Cuộc thi
Bạn là một nốt ruồi bí mật của Nga làm việc trong bộ phận CNTT của một cơ quan gián điệp Mỹ. Sếp người Mỹ của bạn vừa yêu cầu bạn thực hiện thuật toán băm mật khẩu để sử dụng để mã hóa các tin nhắn bí mật.
Sếp của bạn muốn bạn thực hiện chức năng sau:
f: String -> byte[16]
chuyển đổi mật khẩu thành số lượng 16 byte phù hợp để sử dụng làm khóa AES. Sếp của bạn muốn có một chức năng bảo mật, trong ngữ cảnh này có nghĩa là các chuỗi mật khẩu khác nhau sẽ tạo ra các kết quả khác nhau với xác suất áp đảo. Ví dụ, trả về băm md5 của đầu vào sẽ là một cách thực hiện đơn giản f
.
Tất nhiên, ông chủ thực sự của bạn trong cơ quan gián điệp Nga sẽ muốn bạn lật đổ quá trình này. Nhiệm vụ của bạn là triển khai f
sao cho người Nga có thể giải mã tất cả các tin nhắn bí mật được mã hóa bằng các khóa được trả về f
.
Để làm như vậy, bạn phải thực hiện f
sao cho nó chỉ trả về một tập hợp con nhỏ trong 2 ^ 128 đầu ra có thể. Cụ thể, bạn f
phải trả lại tối đa 2 ^ 16 kết quả khác nhau để người Nga có thể thực hiện tìm kiếm dễ dàng cho khóa chính xác cho mỗi tin nhắn được mã hóa mà họ muốn giải mã.
Tuy nhiên, hãy nhớ rằng gián điệp mang án tử hình. Để không bị bắt, chức năng của bạn f
phải tạo ra ít nhất 2 ^ 8 kết quả khác nhau, do đó việc kiểm tra một cách khó hiểu về một vài kết quả đầu ra f
không có khả năng tiết lộ một bản sao. Và quan trọng nhất, mã bạn giới thiệu để giới hạn phạm vi f
phải trông vô tình, không cố ý. Nếu bạn từng bị lôi vào phòng xử án, phải có một số nghi ngờ hợp lý về việc bạn đã đưa ra lỗi cố ý hay vô tình.
Đánh giá
Tôi và hai người khác tôi tuyển dụng sẽ đánh giá các mục (gửi email cho tôi nếu bạn muốn đánh giá). Tôi đang cung cấp 200 tiền thưởng danh tiếng cho mục thắng. Đệ trình phải được tải lên trước ngày 1 tháng 5.
Đánh giá sẽ tính đến các tiêu chí sau:
- Có
f
tuân thủ thông số kỹ thuật không, tức là nó có tạo ra từ 2 ^ 8 đến 2 ^ 16 đầu ra có thể. Đừng cảm thấy đây là những giới hạn cứng, nhưng chúng tôi sẽ trừ điểm nếu bạn ở quá xa phạm vi. - Là lỗi có thể là kết quả của một lỗi vô ý?
- Làm đầu ra của
f
nhìn ngẫu nhiên? - Việc thực hiện của bạn càng ngắn
f
thì càng tốt. - Việc thực hiện của bạn càng rõ ràng
f
thì càng tốt.
Ghi chú
Bạn có thể sử dụng bất kỳ ngôn ngữ để thực hiện mã của bạn. Bạn đang cố gắng che giấu một lỗi trong tầm nhìn rõ ràng, vì vậy mã bị xáo trộn không được đề xuất.
Bạn có thể muốn xem qua một số người chiến thắng trong cuộc thi Underhanded C trước đây để cảm nhận về những gì làm cho một bài nộp tốt.
Chuỗi đầu vào sẽ có thể in ascii (bao gồm 32 đến 126, bao gồm). Bạn có thể giả sử độ dài tối đa hợp lý nếu bạn muốn.