ขอเริ่มก่อน นี่เป็นคำถามที่อยากรู้อยากเห็นซึ่งกวนใจฉันมาระยะหนึ่งแล้ว ฉันใช้กูเกิลเพื่อดูว่ามีคนแสดงความคิดโง่ๆ นี้โดยชอบธรรมแล้วหรือยัง แต่ไม่พบอะไรเลย
ฉันและเพื่อนกำลังทำงานร่วมกันในโครงการเล็กๆ เพื่อเรียนรู้พื้นฐานของการนำการเข้ารหัสไปใช้จริง รายละเอียดไม่ได้มีความสำคัญมากนัก สิ่งที่เราต้องการให้ทำคือแบ่งปันสตริงที่เข้ารหัสผ่านเครือข่าย IP
เราพบปัญหาที่น่าสนใจเมื่อหาวิธีแลกเปลี่ยนความลับที่ใช้ร่วมกันเมื่อมีการจับมือกับ RSA เนื่องจากโปรแกรมเล็กๆ นี้ใช้ไม่ได้กับแนวคิดของไคลเอนต์/เซิร์ฟเวอร์ เราจึงต้องการวิธีที่จะทำให้แน่ใจว่าทั้งสองฝั่งจะเลือกคีย์เดียวกัน เริ่มแรกฉันตรวจสอบการใช้งาน ECC+Diffie-Hellman แบบแพ็คเกจล่วงหน้า (จาก .NET) แต่มีข้อบกพร่องร้ายแรง - คลาสนี้ใช้งานได้บน Windows เท่านั้น แต่เพื่อนของฉันใช้ Mac
เท่าที่ฉันทราบไม่มีการใช้งานการแลกเปลี่ยนคีย์อื่น ๆ ที่บรรจุใน. NET ดังนั้นฉันจึงลงเอยด้วยวิธีแก้ปัญหาง่ายๆ
- เพียร์ทั้งสองส่งคีย์ที่สร้างขึ้นใหม่ (โดยเฉพาะ อาร์เรย์คีย์ AES ไบต์) ไปยังอีกคีย์หนึ่ง
- เพียร์ทั้งสองป้อนคีย์ของพวกเขาและคีย์ของพันธมิตรในอัลกอริทึมซึ่งวนซ้ำตามลำดับในค่าไบต์ (ฉันคิดว่าเป็นจำนวนเต็ม 8 บิตที่แปลงโดยปริยาย) ภายในอาร์เรย์คีย์ทั้งสอง
- หากคีย์หนึ่งมีค่ามากกว่าคีย์อื่นที่ดัชนีหนึ่งๆ คีย์นั้นจะถูกส่งกลับเป็นคีย์ที่เลือก
- หากไม่ตรงตามเงื่อนไขนี้ระหว่างการวนซ้ำ คีย์จะเหมือนกันและไม่สำคัญว่าจะคืนค่าใด (IVs มีอยู่ แต่ไม่สนใจ)
อัลกอริธึม 10 บรรทัดของแฮ็คจ็อบนี้ทำงานได้ดีกว่าที่มันมีสิทธิ์ทำได้มาก ด้วยความเข้าใจที่จำกัดของฉันเกี่ยวกับคณิตศาสตร์ที่เกี่ยวข้อง สิ่งนี้จึงสมเหตุสมผลในการคำนวณ - มี $256^{32}$ คีย์ที่เป็นไปได้และ $\frac{255}{256}$ โอกาสที่จะได้ผลลัพธ์ตามการเปรียบเทียบ (ราคาถูกมาก) ดังนั้นคุณจึงรับประกันได้ว่าจะได้ผลลัพธ์ที่ใช้งานได้ทันที
อย่างไรก็ตาม ฉันยังสงสัยอยู่ อัลกอริทึมนี้มีลักษณะอย่างไรในแง่ของความปลอดภัย ถ้าฉันได้เรียนรู้อะไรจากการค้นหา SE นี้ แม้แต่สิ่งที่ง่ายที่สุด/ไม่มีพิษภัยที่สุดสำหรับคนธรรมดาอย่างฉันก็สามารถแสดงถึงช่องโหว่ด้านความปลอดภัยที่จ้องมองได้
(นอกจากนี้ ฉันสาบานว่าสิ่งนี้จะไม่ถูกใช้ในสิ่งที่สำคัญ ตอนนี้ฉันรู้เกี่ยวกับ Bouncy Castle แล้ว ขอบคุณพระเจ้า)