ทำไมฉันถึงสนใจ: ฉันต้องการใช้เซสชันที่ปลอดภัยสำหรับการสื่อสารทางอินเทอร์เน็ต และเนื่องจากฉันเป็นมือสมัครเล่นอย่างสมบูรณ์ในเรื่องนี้ และไม่ต้องการใช้เวลามากมายในการเรียนรู้เกี่ยวกับการเข้ารหัสหรือเกี่ยวกับไลบรารีเฉพาะ (เนื่องจากฉันทำสิ่งนี้เพื่อความสนุกเท่านั้น) ฉัน ต้องการมีการเตรียมการน้อยที่สุดจากด้านการเขียนโปรแกรม จากด้านคณิตศาสตร์ ฉันเก่งวิชานี้ ดังนั้นการใช้เวลาคิดมากขึ้น (ซึ่งตรงข้ามกับกูเกิลและการอ่านเอกสาร) จึงไม่ใช่ปัญหา
การคาดเดา/คำถามของฉัน: ส่วนที่น่าสนใจเกิดขึ้นเมื่อฉันตระหนักว่ามีการเข้ารหัสแบบอสมมาตรเพียงอันเดียว (บล็อกหรือสตรีม) เรียกมันว่า $X$เพียงพอสำหรับความต้องการการเข้ารหัสขั้นพื้นฐานทั้งหมดกล่าวอีกนัยหนึ่ง หมวดหมู่การเข้ารหัสพื้นฐานอื่นๆ ทั้งหมด (การเข้ารหัสประเภทอื่นๆ ฟังก์ชันแฮช และลายเซ็น ไม่ใช่อื่นๆ) สามารถลดลงเป็นอัลกอริทึมนี้ คุณสามารถสร้างอัลกอริทึมการแฮชโดยใช้เท่านั้น $X$และอัลกอริทึมการเซ็นชื่อโดยใช้เท่านั้น $X$. นี่หมายความว่าการรวมอัลกอริธึมเช่น RSA+ChaCha+Poly1305 หรืออะไรก็ตามที่ไม่ล้าสมัยเมื่อความเร็วไม่เกี่ยวข้อง ฉันไม่ได้ตั้งเป้าหมายสูงไปกว่าการสื่อสารทางอินเทอร์เน็ต FHE และสิ่งที่คล้ายกันอยู่นอกขอบเขต ถ้าอย่างนั้นแค่ปฏิบัติอย่างเดียวไม่พอหรือ $X$ เมื่อเวลาและความเร็วไม่สัมพันธ์กัน? เหตุใดผู้คนจึงคิดค้นอัลกอริทึมเหล่านี้ นอกเหนือไปจากเหตุผลด้านความเร็ว
หลักฐานของฉัน:
เปลี่ยนรหัสสตรีมเป็นรหัสบล็อก:
เพียงประมวลผลสตรีมที่มีความยาวคงที่ด้วยรหัสสตรีมและเรียกมันว่ารหัสบล็อก
การเปลี่ยนรหัสลับบล็อกที่กระทำกับชุดของขนาดตามอำเภอใจเป็นรหัสบล็อกที่กระทำกับชุดของขนาดกำลังของ $2$.
อนุญาต $A$ เป็นตัวตั้ง $\{1,\จุด,N\}$. อนุญาต $X$ เป็นรหัสบล็อกที่มีสองฟังก์ชัน $E$ และ $D$ (ฟังก์ชันการเข้ารหัสและถอดรหัส) ที่แมปองค์ประกอบจาก $A$ ถึง $A$. อนุญาต $2^k$ เป็นพลังอันยิ่งใหญ่ของ $2$ น้อยกว่าหรือเท่ากับ $N$. อนุญาต $B$ เป็นตัวตั้ง $\{1,\dots,2^k\}$. อนุญาต $x$ เป็นตัวเลขจาก $A$. ลำดับ $x,E(x),E(E(x)),...$ จะถือว่าสุ่มและกระจายอย่างสม่ำเสมอในชุด $A$ (ยังเป็นวัฏจักรที่ยาวนานเนื่องจากเป็นรหัสที่ไม่สมมาตร) ซึ่งให้ตัวเลขนั้นมาจาก $B$ เกิดขึ้นโดยเฉลี่ยทุกครั้ง $\frac{|B|}{|A|}$ องค์ประกอบ เราสามารถนำเหตุการณ์ที่เกิดขึ้นครั้งแรกเป็นภาพของฟังก์ชันใหม่ได้ $E'$ ที่ตอนนี้แผนที่จาก $B$ ถึง $B$. กำหนด $D'$ ที่จะตรงกันข้ามกับ $E'$. คู่ $(อี',ด')$ เป็นรหัสบล็อกใหม่ที่ทำหน้าที่ชุดของขนาด $2^k$กล่าวอีกนัยหนึ่งบนบล็อกของ $k$ บิต มันปลอดภัยพอๆ $X$ เพราะหากเราสามารถถอดรหัสรหัสลับนี้ได้ ก็หมายความว่าเราสามารถค้นหาผลลัพธ์ของรหัสเดิมที่ใช้ไม่กี่ครั้ง พูด $m$ ครั้ง.จากนั้นเราก็สามารถนำรหัสกลับมาใช้ใหม่ได้ $m-1$ หลายครั้งในข้อความที่เข้ารหัส จากนั้นใช้แคร็กนี้เพื่อเลิกทำ $m$ ครั้ง. เนื่องจาก $m$ คาดว่าจะน้อยกว่า $k$สิ่งนี้เป็นไปได้
การเปลี่ยนรหัสขนาดบล็อก $2^k$ เป็นรหัสสตรีม
สมมติว่า $k$ เท่ากัน (อธิบายแนวคิดได้ง่ายกว่า) ในทางเทคนิคแล้ว ฉันแค่เข้ารหัสและถอดรหัสข้อความที่มีขนาดตามอำเภอใจเท่านั้น ซึ่งไม่ใช่รหัสสตรีม ประการแรก ขยายข้อความให้มีความยาวหลายเท่าของ $\frac{k}{2}$. คิดว่าข้อความนี้เป็นลำดับของบล็อกที่มีขนาด $\frac{k}{2}$. เราสามารถเข้ารหัสคู่ของบล็อกเหล่านี้แบบแทนที่: บล็อกแรกและบล็อกที่สองรวมกัน จากนั้นบล็อกที่สองและสาม และอื่น ๆ... จนจบ จนถึงตอนนี้ สิ่งนี้คล้ายกับรหัสสตรีม เราสามารถเลือกเพิ่มจุดเริ่มต้นแบบสุ่มให้กับข้อความได้หากเดิมทีข้อความนั้นสั้นเกินไป เรายังสามารถเลือกย้อนกลับลำดับของบล็อกเหล่านี้และใช้ลำดับการเข้ารหัสเดียวกันได้ ตอนนี้ เราสามารถถอดรหัสข้อความทั้งหมดหรือไม่ก็ได้: หากเราสูญเสียส่วนหนึ่งของข้อความ เราจะไม่สามารถถอดรหัสอะไรได้อีก เช่นเดียวกับการเข้ารหัสบล็อกเริ่มต้นที่มีไว้เพื่อให้ทำงาน วิธีนี้ปลอดภัยพอๆ กับการเข้ารหัสบล็อกดั้งเดิม เพราะหากเราสามารถถอดรหัสข้อความทั้งหมดได้ เราจะเรียกใช้การเข้ารหัสซ้ำและสร้างผลิตภัณฑ์ระหว่างกันทั้งหมดได้ รวมถึงการถอดรหัสของ 2 บล็อกล่าสุดที่ตัวเข้ารหัสเข้ารหัสไว้
เปลี่ยนรหัสบล็อกให้เป็นฟังก์ชันแฮช
ฉันแก้ไขส่วนนี้เนื่องจากความคิดแรกผิด ...
สร้างคู่คีย์สองคู่แล้วโยนคีย์ส่วนตัวทิ้งไป และฮาร์ดโค้ดคีย์สาธารณะในอัลกอริทึม เช่นเดียวกับ int ส่วนก่อนหน้า เตรียมบล็อก ตอนนี้เข้ารหัสแรก $k$ บิตเข้าที่ก่อนด้วยคีย์เดียว จากนั้นลบด้วยอีกคีย์หนึ่ง $l<<k$, $l|k$ "สุ่ม" (หลอกสุ่มเพาะโดยแฮชง่ายๆของข้อความ) บิตจากสิ่งนี้สร้างขึ้น $k$ บิตและเชื่อมต่อส่วนที่เหลือของบิต ทำไปเรื่อยๆจนกว่าจะมีเท่านั้น $k$ เหลือบิตแล้วเรียกมันว่าแฮชที่แข็งแกร่งสิ่งนี้ปลอดภัยพอๆ กับรหัส เพราะหากเราสมมติว่าเราพบข้อความอื่นที่มีเอาต์พุตเดียวกัน ในขณะที่เรากำลังทำการปรับปรุงใหม่ทั้งสองรายการพร้อมกัน ในช่วงเวลาหนึ่ง เราจะสร้างข้อมูลเดียวกัน $k-l$ บิต (หลังจากลบไฟล์สุ่ม $l$ บิต) นี่คือสาเหตุที่มันยาก: นั่นคือ $k-l$ สามารถเติมบิตได้ $k$ บิตในมากที่สุด $2^l\binom{k}{l}$ (ซึ่งเราจะมัดได้จำนวนน้อย) แล้วส่วนใหญ่จะผลิตไม่เหมือนกัน $k-l$ บิตที่ช่วยในการ จำกัด แม้ว่าเราจะสามารถถอดรหัสชุดค่าผสมอื่นได้ $k$ บิต (ซึ่งอาจเป็นไปได้เพราะมีลักษณะคล้ายกับต้นฉบับ $k$ บิต) ที่ถอดรหัส $k$ บิตจะต้องถูกถอดรหัสอีกครั้ง แต่ตอนนี้มันไม่เหมือนกับต้นฉบับ $k$ บิต ดังนั้นโดยพื้นฐานแล้วเราจะต้องถอดรหัสรหัส ณ จุดนี้ เราใช้การเข้ารหัสที่แตกต่างกันสองรหัส (คีย์สาธารณะที่แตกต่างกันสองคีย์) เนื่องจากเราต้องการขจัดความอ่อน
เปลี่ยนรหัสบล็อกเป็นฟังก์ชันลายเซ็น
เราสามารถคำนวณแฮชของข้อความก่อนแล้วจึงเข้ารหัสแฮช เห็นได้ชัดว่าปลอดภัย เนื่องจากเป็นวิธีการทำงานของอัลกอริทึมในปัจจุบัน
ฉันขอโทษที่ใช้แท็กต่างกัน ฉันแค่ไม่รู้ว่าจะใช้แท็กอะไรดี