TL;DR; ไม่ปลอดภัยอย่าใช้มัน ใช้มาตรฐานและโหมดการทำงานที่เป็นที่รู้จัก
การก่อสร้างของคุณคือ $s_i = H^i(รหัสผ่าน)$ เช่น แฮชรหัสผ่าน $i$ ครั้งแล้วใช้ผลลัพธ์ $s_i$ สำหรับแต่ละขั้นตอนไปยัง x-หรือด้วยข้อความธรรมดาเพื่อมาถึงข้อความเข้ารหัส $c_i = p_i \oบวก s_i$
ศัตรูจะทำลายสิ่งนี้ได้อย่างไร
มีวิธีที่จะบรรลุเป้าหมายนี้
การโจมตีที่เดาได้: หากมีคนได้รับบางส่วนของข้อความของคุณ เช่น อย่างน้อย 256 บิตของบล็อก SHA-256 แบบเต็ม ข้อความที่เหลือจะถูกถอดรหัสอย่างง่ายดาย ดังนั้น ไม่มีความลับล่วงหน้าที่นี่.
หนึ่งควรดูที่สไลด์เหล่านี้เกี่ยวกับ Hash_DRGB ดูการออกแบบที่ดีกว่าในการต่อต้านการประนีประนอมของรัฐ เมื่อสร้าง Pseudo-Random Sequence ประนีประนอมของสถานะปัจจุบันต้องไม่รั่วไหลสถานะอื่น ความล้มเหลวหลักของการออกแบบที่เสนอคือสิ่งนี้
แผนของคุณดูเหมือนจะเสี่ยงต่อ การโจมตีต้องห้าม ว่าเมื่อ $(IV,คีย์)$ การจับคู่โหมด CTR ซ้ำสามารถทำลายความลับของข้อความเข้ารหัสได้ คุณไม่ได้กำหนด IV ในรูปแบบของคุณ ดังนั้นคุณจะมีรหัสผ่านเดียวกัน และสตรีมที่สร้างโดยรหัสของคุณจะสร้างเอาต์พุตเดียวกันตลอดเวลา
ทั้งสองคนต้องเปลี่ยนรหัสผ่านทุกครั้งที่มีการเข้ารหัสหรือต้องแนะนำแนวทางปฏิบัติมาตรฐาน IV เพื่อบรรเทา มิฉะนั้นหายนะ!
ไม่สามารถตรวจสอบความปลอดภัยของรหัสผ่านได้ และเรามักจะใช้ฟังก์ชันการสืบทอดคีย์ที่ใช้รหัสผ่าน เช่น PBKDF2, Scrypt หรือ Argon2 เพื่อรับรหัสผ่านแบบสุ่ม สิ่งเหล่านี้อย่างน้อยให้จำนวนการวนซ้ำเพื่อลดการโจมตีด้วยการค้นหารหัสผ่าน พวกเขายังมีสายรัดหน่วยความจำและจำนวนเธรดเพื่อลดความสามารถในการโจมตีด้วยการค้นหารหัสผ่าน เนื่องจากรูปแบบของคุณมีความเสี่ยงต่อการโจมตีที่ต้องห้าม ผู้ใช้จะเลือกรหัสผ่านใหม่สำหรับการเข้ารหัสทุกครั้งได้ยากขึ้น
เราใช้คีย์สุ่มซึ่งสร้างขึ้นภายในเครื่องเพื่อใช้หรือได้รับมาจากโปรโตคอลเช่น DHKE
ความปลอดภัยของโครงร่างของคุณขึ้นอยู่กับ ความปลอดภัยของรหัสผ่าน และจะเป็นจุดโจมตีที่ดีเนื่องจากผู้ใช้ทั่วไปไม่สามารถบรรลุและจัดการรหัสผ่านที่ดีได้แม้ว่าจะสามารถใช้ dice-wire เช่นรหัสผ่านเพื่อสร้างรหัสผ่านที่มีความเข้มงวดประมาณ 256 บิต แต่ยิ่งมีการเข้ารหัสมากเท่าไหร่รหัสผ่านที่ต้องจำก็จะยิ่งเป็นไปไม่ได้ การใช้รหัสผ่านที่ดีและได้รับคีย์การเข้ารหัสที่เข้ารหัสอินพุตแบบสุ่มสำหรับโครงร่างของคุณแทนนั้นเป็นทางเลือกที่ดีกว่า
สำหรับการเข้ารหัสแบบโลคัล การปฏิบัติตามปกติคือ สร้าง FEK คีย์การเข้ารหัสไฟล์แบบสุ่มสำหรับทุกไฟล์ จากนั้นใช้รหัสผ่านของผู้ใช้เพื่อรับ Key Encryption Key (KEK) ที่มี PBKDF ที่ดีเช่น Argon2 ด้วย KEK เข้ารหัสและถอดรหัส FEK จากนั้นจึงเข้ารหัส/ถอดรหัสไฟล์ รายละเอียดเพิ่มเติมคือ ที่นี่.
โครงการของคุณ ขาดการเข้าถึงแบบสุ่มดังนั้นจึงไม่มีประโยชน์สำหรับแอปพลิเคชันจำนวนมาก เช่น การเข้ารหัสดิสก์
คุณร้องขอเพียงการต่อต้านภาพล่วงหน้าเท่านั้น อย่างไรก็ตาม คุณจะทำเช่นกัน ต้องการความต้านทานการชน. หากเกิดการชนกันได้ง่ายบนกระแสที่สร้างขึ้น ก็จะเกิดซ้ำ และนี่คือจุดโจมตี อย่างน้อยสตรีมของคุณจะไม่เป็นลำดับสุ่มหลอก โชคดีสำหรับคุณ SHA-256 มีความต้านทานการชนและช่วงรอบที่คาดหวังนั้นใหญ่มาก
ให้โมเดล SHA-256 เป็นฟังก์ชันสุ่มแบบสม่ำเสมอ ดังนั้นความน่าจะเป็นขององค์ประกอบที่อยู่ในวงจรคือ
$$\frac{1}{\sqrt{\hspace{.03 in}2\hspace{-0.05 in}\cdot \hspace{-0.04 in}\pi} \cdot 2^{127}}$$
ความยาวรอบเฉลี่ยที่มีค่าคาดไว้สำหรับ SHA-256 คือ $$2^{127} \sqrt{2\pi}$$ ดังนั้นคุณจึงไม่ต้องกลัวรอบสั้น การอ้างอิงคือ แฮร์ริส 2503
แบบแผนของคุณไม่มีการรักษาความปลอดภัย Ind-CPA
เรามีอะไรแทนสิ่งนี้?
นี่เป็นข้อได้เปรียบอย่างมากเนื่องจากทำให้สามารถใช้ฟังก์ชันต่างๆ มากมายแทนการใช้ PRP ได้เพียงอย่างเดียวโหมด CTR มี IV เพื่อสุ่มการเข้ารหัสและได้การเข้ารหัสที่น่าจะเป็น CTR สามารถบรรลุความปลอดภัย Ind-CPA
ปัจจุบัน การเข้ารหัสทั้งหมดในโหมด TLS ใช้โหมด CTR ภายใน, AES-GCM, AES-CCM และ ChaCha20-Poly1305
บทสรุป
ไม่มีข้อได้เปรียบเหนือโหมด CTR แม้ว่าคุณจะเพิ่ม IV ในรูปแบบการเข้ารหัสของคุณ และแม้แต่คุณแก้ปัญหารหัสผ่านและส่วนที่เป็นปัญหามากที่สุด: การโจมตีที่คาดเดาได้.