Để bắt đầu, đây chủ yếu là một câu hỏi tò mò đã làm tôi khó chịu trong một thời gian. Tôi đã tìm kiếm khá nhiều trên Google để xem liệu có ai đó đã vạch trần ý tưởng ngớ ngẩn này một cách chính đáng hay chưa, nhưng không tìm thấy gì cả.
Tôi và một người bạn đang làm việc cùng nhau trong một dự án nhỏ để tìm hiểu những kiến thức cơ bản về cách triển khai mã hóa trên thực tế. Các chi tiết không đặc biệt quan trọng, tất cả những gì chúng tôi muốn nó làm là chia sẻ các chuỗi được mã hóa qua mạng IP.
Chúng tôi đã gặp phải một vấn đề thú vị khi tìm ra cách trao đổi bí mật được chia sẻ sau khi bắt tay RSA được thực hiện. Vì chương trình nhỏ bé này không hoạt động trên khái niệm máy khách/máy chủ, nên chúng tôi cần một cách để đảm bảo cả hai đầu sẽ chọn cùng một khóa. Ban đầu, tôi đã điều tra việc triển khai ECC+Diffie-Hellman (từ .NET) được đóng gói sẵn, nhưng có một lỗ hổng nghiêm trọng - lớp này chỉ hoạt động trên Windows, nhưng bạn tôi thì sử dụng máy Mac.
Theo những gì tôi biết thì không có bất kỳ triển khai trao đổi khóa nào khác được đóng gói trong .NET, vì vậy cuối cùng tôi đã đưa ra một giải pháp đơn giản:
- Cả hai đồng nghiệp gửi một khóa mới được tạo (cụ thể là một mảng byte khóa AES) cho nhau.
- Cả hai đồng nghiệp đều cung cấp khóa của họ và khóa của đối tác của họ vào một thuật toán, thuật toán này lặp lại tuần tự trên các giá trị byte (tôi nghĩ là các số nguyên 8 bit được chuyển đổi hoàn toàn?) Trong cả hai mảng khóa.
- Nếu một khóa có giá trị lớn hơn khóa kia tại một chỉ mục nhất định, khóa đó sẽ được trả về dưới dạng khóa đã chọn.
- Nếu điều kiện này không bao giờ được đáp ứng trong quá trình lặp, thì các khóa giống hệt nhau và việc trả lại khóa nào không quan trọng. (IV đã có mặt nhưng bị bỏ qua.)
Thuật toán mười dòng hackjob này hoạt động tốt hơn nhiều so với bất kỳ quyền nào của nó. Với sự hiểu biết hạn chế của tôi về toán học liên quan, điều này có ý nghĩa về mặt tính toán - có $256^{32}$ các phím có thể và một $\frac{255}{256}$ cơ hội nhận được kết quả cho mỗi so sánh (cực kỳ rẻ), vì vậy về cơ bản bạn được đảm bảo một kết quả có thể sử dụng ngay lập tức.
Tuy nhiên, tôi vẫn tò mò - thuật toán này trông như thế nào từ quan điểm bảo mật? Nếu tôi đã học được bất cứ điều gì từ việc duyệt SE này, thì đó là ngay cả những thứ đơn giản nhất/vô hại nhất đối với một người bình thường như tôi cũng có thể đại diện cho các lỗ hổng bảo mật rõ ràng.
(Còn nữa, tôi thề là cái này sẽ không bao giờ được dùng cho việc gì quan trọng. Bây giờ tôi đã biết về Lâu đài Bouncy, tạ ơn Chúa.)