Thử thách này mang về tiền thưởng 200 điểm cho người đầu tiên trả lời và vẫn bất bại trong ít nhất 3 ngày.Được yêu cầu bởi người dùng3080953 .
Gần đây có rất nhiều cuộc nói chuyện về mã hóa đầu cuối và áp lực đối với các công ty loại bỏ nó khỏi sản phẩm của họ. Tôi không quan tâm đến các quyền và sai của điều đó, nhưng tôi tự hỏi: làm thế nào ngắn mã có thể khiến một công ty bị áp lực không sử dụng nó?
Thách thức ở đây là thực hiện trao đổi khóa Diffie Hellman giữa hai hệ thống được nối mạng, sau đó cho phép người dùng liên lạc qua lại bằng cách sử dụng khóa đối xứng được tạo. Với mục đích của nhiệm vụ này, không yêu cầu bảo vệ nào khác (ví dụ: không cần phải xoay vòng khóa, xác minh danh tính, bảo vệ chống lại DoS, v.v.) và bạn có thể giả sử một mạng internet mở (mọi cổng bạn nghe đều có sẵn cho mọi người). Sử dụng nội dung được cho phép và khuyến khích!
Bạn có thể chọn một trong hai mô hình:
- Máy chủ và máy khách: máy khách kết nối với máy chủ, sau đó máy chủ hoặc máy khách có thể gửi tin nhắn đến máy chủ khác. Các bên thứ ba ở giữa hai bên phải không thể đọc được tin nhắn. Một luồng ví dụ có thể là:
- Người dùng A khởi chạy máy chủ
- Người dùng B khởi chạy ứng dụng khách và hướng nó đến máy chủ của người dùng A (ví dụ: qua IP / cổng), chương trình sẽ mở ra một kết nối
- Chương trình của Người dùng A thừa nhận kết nối (tùy chọn yêu cầu người dùng đồng ý trước)
- Chương trình của Người dùng B bắt đầu tạo bí mật DH và gửi dữ liệu cần thiết (khóa chung, số nguyên tố, trình tạo, bất kỳ thứ gì khác mà bạn cần thực hiện) cho Người dùng A
- Chương trình của Người dùng A sử dụng dữ liệu đã gửi để hoàn thành việc tạo bí mật được chia sẻ và gửi lại dữ liệu cần thiết (khóa chung) cho Người dùng B. Từ thời điểm này, Người dùng A có thể nhập tin nhắn (ví dụ qua stdin) sẽ được mã hóa và gửi cho Người dùng B (ví dụ như thiết bị xuất chuẩn).
- Chương trình của người dùng B hoàn thành việc tạo bí mật chung. Từ thời điểm này, Người dùng B có thể gửi tin nhắn đến Người dùng A.
- Hoặc: Một máy chủ có hai máy khách được kết nối với nó: mỗi máy khách nói chuyện với máy chủ, chuyển tiếp tin nhắn của chúng đến máy khách khác. Bản thân máy chủ (và bất kỳ bên thứ ba nào ở giữa) phải không thể đọc được tin nhắn. Khác với kết nối ban đầu, quy trình này giống như kết nối được mô tả trong tùy chọn đầu tiên.
Quy tắc chi tiết:
- Bạn có thể cung cấp một chương trình hoặc nhiều chương trình (ví dụ: máy chủ và máy khách). Điểm của bạn là tổng kích thước mã trên tất cả các chương trình.
- Về mặt lý thuyết, chương trình của bạn phải có khả năng giao tiếp qua mạng (nhưng để kiểm tra, localhost vẫn ổn). Nếu ngôn ngữ bạn chọn không hỗ trợ kết nối mạng, bạn có thể kết hợp nó với ngôn ngữ nào đó (ví dụ: tập lệnh shell); trong trường hợp này, điểm của bạn là tổng kích thước mã trên tất cả các ngôn ngữ được sử dụng.
- Thế hệ khóa Diffie Hellman có thể sử dụng các giá trị "p" và "g" được mã hóa cứng.
- Khóa chia sẻ được tạo phải có ít nhất 1024 bit.
- Khi khóa được chia sẻ, sự lựa chọn của mã hóa khóa đối xứng là tùy thuộc vào bạn, nhưng bạn không được chọn một phương pháp hiện được biết là có một cuộc tấn công thực tế chống lại nó (ví dụ: dịch chuyển caesar là không quan trọng để đảo ngược mà không biết về khóa ). Các thuật toán được phép ví dụ:
- AES (kích thước bất kỳ)
- RC4 (về mặt lý thuyết bị phá vỡ, nhưng không có cuộc tấn công thực tế nào mà tôi có thể tìm thấy đề cập đến, vì vậy nó được phép ở đây)
- Cả người dùng A và B đều có thể gửi tin nhắn cho nhau (giao tiếp hai chiều) một cách tương tác (ví dụ: đọc các dòng từ stdin, liên tục nhắc hoặc các sự kiện như nhấn nút). Nếu việc này dễ dàng hơn, bạn có thể giả sử một cuộc trò chuyện xen kẽ (tức là sau khi người dùng gửi tin nhắn, họ phải chờ phản hồi trước khi gửi tin nhắn tiếp theo của họ)
- Nội dung ngôn ngữ được cho phép (không cần phải viết phương thức mã hóa hoặc kết nối mạng của riêng bạn nếu chúng đã được hỗ trợ).
- Các định dạng truyền thông cơ bản là tùy thuộc vào bạn.
- Các bước giao tiếp được đưa ra ở trên là một ví dụ, nhưng bạn không bắt buộc phải tuân theo chúng (miễn là thông tin cần thiết được chia sẻ và không có người trung gian nào có thể tính toán khóa hoặc tin nhắn được chia sẻ)
- Nếu các chi tiết cần thiết để kết nối với máy chủ của bạn không được biết trước (ví dụ: nếu nó nghe trên một cổng ngẫu nhiên), thì các chi tiết này phải được in. Bạn có thể giả sử rằng địa chỉ IP của máy đã được biết.
- Xử lý lỗi (ví dụ: địa chỉ không hợp lệ, mất kết nối, v.v.) là không bắt buộc.
- Thách thức là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
p
vàg
được phép?