Score:13

เกิดอะไรขึ้นกับการเข้ารหัส XOR ด้วย PRNG ที่ปลอดภัย

ธง in

สมมติว่าฉันต้องการเข้ารหัสข้อความด้วยรหัสผ่าน

ฉันไม่สามารถ XOR ไบต์ด้วยไบต์จากตัวสร้างตัวเลขปลอมเทียมที่ปลอดภัยด้วยการเข้ารหัส (CSPRNG) โดยที่เมล็ดเป็นรหัสผ่านหรือแฮชของมันได้หรือไม่ ฉันไม่เห็นอะไรผิดปกติกับเรื่องนี้

หรือ CSPRNG ช้ามากจนจำเป็นต้องมีโครงร่างการเข้ารหัสที่ซับซ้อนกว่านี้?

us flag
คำถามที่คล้ายกันที่นี่: https://crypto.stackexchange.com/questions/35809/whats-wrong-with-xor-encryption-with-hash-and-an-iterated-salt?rq=1
fraxinus avatar
sa flag
คุณเกือบจะคิดค้นโหมด CTR (Counter) ของการดำเนินการเข้ารหัส
Score:22
ธง in

ไบต์ที่คุณ XOR พร้อมข้อความเพื่อรับไซเฟอร์เท็กซ์เรียกว่า คีย์สตรีม. มีความปลอดภัยในการสร้างสตรีมคีย์โดยใช้ CSPRNG ใช่ ตัวสร้างตัวเลขสุ่มหลอกที่ปลอดภัยแบบเข้ารหัสและเมล็ดพันธุ์แบบสแตติก

อย่างไรก็ตาม มีปัญหาในทางปฏิบัติหากคุณใช้ CSPRNG ของระบบ:

  • มันอาจจะตัดสินใจ (re-) เมล็ดเป็นครั้งคราว;
  • อัลกอริทึมอาจเปลี่ยนแปลงตามเวลาหรือระหว่างระบบ
  • วิธีแยกไบต์แบบสุ่มอาจเปลี่ยนแปลงได้ (เช่น ตัดสินใจจัดตำแหน่งคำ)

ดังนั้นคุณต้องแน่ใจว่าการดำเนินการ CSPRNG นั้นสมบูรณ์ก่อนที่คุณจะใช้มันเพื่อเข้ารหัสบางอย่าง ในกรณีที่เลวร้ายที่สุดจะมีการรวมข้อมูลแบบสุ่มเพื่อวางรหัสของคุณ ซึ่งในกรณีนี้ข้อมูลจะสูญหายไปอย่างมีประสิทธิภาพ นี้ ได้เกิดขึ้นมาก่อน เมื่อ "SHA1PRNG" ของ Sun ถูกแทนที่ด้วยอัลกอริทึมอื่นก่อน แล้วจึงตามด้วยข้อมูลสุ่ม OpenSSL บน Android

ในทางทฤษฎี stream cipher - หรือ block cipher ในโหมด stream คือ CSPRNG ที่มีเมล็ดเดียว (การรวมกันของคีย์และ IV/nonce) อัลกอริทึมเฉพาะและวิธีการดึงคีย์สตรีมที่กำหนดไว้ โดยทั่วไปแล้ว คำตอบที่น่าเบื่อคือการใช้ AES-CTR เพื่อสร้างคีย์สตรีม และใช้ AES-GCM ซึ่งใช้ AES-CTR ภายใน หากคุณต้องการการตรวจสอบข้อความด้วย ในระบบที่ไม่มีการเร่งด้วยฮาร์ดแวร์ สามารถใช้รหัสสตรีมเช่น ChaCha20 แทนได้

คุณยังสามารถสร้างการเข้ารหัสสตรีมจากฟังก์ชันแฮชได้โดยใช้โหมดตัวนับ คุณควรจะใช้โครงสร้าง MAC เช่น HMAC สำหรับสิ่งนั้น ที่จริงแล้ว CSPRNG ส่วนใหญ่ที่ระบบจัดหาให้นั้นมีไม่มากไปกว่านั้น - แต่ตามที่ระบุไว้ โดยทั่วไปแล้ว CSPRNG ได้รับการออกแบบมาเพื่อให้ข้อมูลแบบสุ่ม ไม่ใช่ข้อมูลเชิงกำหนด และใช่ โดยทั่วไปแล้วอัลกอริทึมเหล่านี้จะช้ากว่ารหัสสตรีมเฉพาะหรือรหัสบล็อกเร่งด้วยฮาร์ดแวร์ - พวกมันคือ ซับซ้อนยิ่งขึ้น ค่อนข้างซับซ้อนน้อยกว่า

in flag
ฉันจะพิจารณากำหนด PRNG ตามคำจำกัดความ เช่น. âCSPRNG ของระบบของคุณâ แท้จริงแล้วไม่ใช่ CSPRNG เลย แต่เป็นแหล่งสุ่มเสริมด้วย CSPRNG
Maarten Bodewes avatar
in flag
หรือ CSPRNG เสริมด้วยแหล่งสุ่ม ใช่ บ่อยครั้งที่คุณได้รับมันมารวมกัน - ซึ่งก็ใช้ได้ตราบใดที่คุณใช้มันเพื่อรับตัวเลขสุ่ม (-ized) จากแหล่งเอนโทรปีที่ จำกัด
Score:16
ธง in

ใช่คุณสามารถ; เรียกว่า รหัสสตรีม. สามารถมองเป็นค่าประมาณของ แผ่นครั้งเดียวซึ่งคุณมีเอนโทรปีไม่เพียงพอที่จะสร้างคีย์ OTP (ซึ่งต้องมีความยาวเท่ากับข้อความธรรมดา) แต่มีเพียงพอสำหรับการเพาะ PRNG

ช่องโหว่ทั่วไปของ stream ciphers ที่ไม่ขึ้นกับทางเลือกของอัลกอริธึมการสร้างคีย์สตรีม ได้แก่:

  • ใช้คีย์โจมตีซ้ำ หากคุณมีสิทธิ์เข้าถึงข้อความที่เข้ารหัสสองข้อความ คุณสามารถ XOR ข้อความทั้งสองนั้นเพื่อรับ XOR ของข้อความธรรมดาสองข้อความ คำตอบนี้ แสดงให้เห็นอย่างชัดเจนว่าสิ่งนี้จะไม่ปลอดภัยได้อย่างไร เพื่อหลีกเลี่ยงการโจมตีนี้ ห้ามใช้รหัสผ่านของคุณซ้ำ และตรวจสอบให้แน่ใจว่าฟังก์ชันแฮชสำหรับสร้างคีย์ของคุณมีความต้านทานการชนที่เพียงพอ
  • การโจมตีแบบพลิกบิต. สมมติว่าผู้โจมตีดักฟังข้อความที่เข้ารหัสของคุณ และในขณะที่เธอไม่รู้ข้อความทั้งหมด แต่เธอก็รู้ว่าตัวเลขนั้น 1 ปรากฏที่ตำแหน่งใดตำแหน่งหนึ่งในนั้น ซึ่งเข้ารหัสในไซเฟอร์เท็กซ์เป็น 0x2A การเปลี่ยนไบต์นั้นเป็น 0x22 (= 0x2A ^ ('1' ^ '9')) จะเปลี่ยนสิ่งนั้น 1 ถึง ก 9 ในข้อความธรรมดา และ "ฉันเป็นหนี้คุณ \$100â ที่คุณส่งมา จะได้รับเป็น "ฉันเป็นหนี้คุณ \$900â" การโจมตีนี้สามารถบรรเทาได้โดยการใส่ แมค ด้วยข้อความของคุณเพื่อตรวจหาการเปลี่ยนแปลง
za flag
สมมติว่าผู้โจมตีรู้ว่าส่วนสุดท้ายของคุกกี้เข้ารหัสของคุณคือ `is_admin=0` :-)
Joshua avatar
cn flag
@hanshenrik: เรื่องน่ารู้ ฉันมีคุกกี้ที่ทำหน้าที่เช่นนั้น แต่ถ้าคุณเปลี่ยน is_admin เป็น 1 คุณจะหลอกจาวาสคริปต์เท่านั้น เซิร์ฟเวอร์ไม่ได้ถูกหลอก
Score:6
ธง kr

นอกจากคำตอบของ "Maarten Bodewes" และ "dan04" แล้ว:

แบบแผนของคุณไม่ได้ให้ความคุ้มครองใด ๆ ความซื่อสัตย์. หากคุณใช้รหัสผ่านเดียวกันสำหรับข้อความที่แตกต่างกัน ไบต์ที่ 1 จะเหมือนกันในคีย์ที่สร้างขึ้นทั้งหมด ไบต์ที่ 2 จะเหมือนกันอีกครั้งในคีย์ที่สร้างขึ้นทั้งหมด เป็นต้น ซึ่งหมายความว่าผู้โจมตีสามารถแทนที่ไบต์ใดๆ ในข้อความที่เข้ารหัสด้วย ไบต์ที่มีหมายเลขเดียวกันจากข้อความอื่น และคุณจะไม่สามารถตรวจจับได้ว่าข้อความที่เข้ารหัสของคุณถูกแก้ไขหรือไม่ ในการทำเช่นนี้ ผู้โจมตีไม่จำเป็นต้องรู้รหัสผ่านด้วยซ้ำ ดังนั้นผู้โจมตีสามารถเปลี่ยนข้อความที่เข้ารหัสจาก "โอน 1,000 USD" เป็น "โอน 5,000 USD" และไม่มีใครสามารถตรวจจับได้ว่าข้อความที่เข้ารหัสนั้นถูกแก้ไข

ilkkachu avatar
ws flag
การใช้รหัสผ่าน/คีย์เดียวกันสำหรับหลายข้อความยังมีแนวโน้มที่จะเปิดการโจมตีการถอดรหัสอีกด้วย
kr flag
@ilkkachu: แน่นอน "dan04" ได้กล่าวถึงมัน ฉันไม่เห็นเหตุผลที่จะทำซ้ำ
kr flag
โปรดทราบว่าหัวข้อย่อยที่สองในคำตอบของ dan04 นั้นเกี่ยวกับความซื่อสัตย์ด้วย ความแตกต่างระหว่างสิ่งนี้กับอันนั้นค่อนข้างละเอียดอ่อน: อันนั้นดูกว้างกว่า (เนื่องจากไม่ได้ขึ้นอยู่กับการมีหลายข้อความ) แต่อาจมีบางสถานการณ์ที่การโจมตีนี้เป็นไปได้ แต่อันนั้นไม่ใช่
R.. GitHub STOP HELPING ICE avatar
การไม่สามารถใช้คีย์สตรีมเดียวกันซ้ำได้นั้นเป็นปัญหาที่ค่อนข้างแตกต่างออกไป แม้จะไม่มีสิ่งนั้น ผู้โจมตีก็สามารถเปลี่ยนข้อความได้ พวกเขาไม่สามารถแทนที่ข้อความอื่นที่รู้จัก แต่สามารถพลิกบิตเฉพาะได้ ฯลฯ คุณต้องมีการเข้ารหัสที่ได้รับการรับรองความถูกต้องเพื่อหลีกเลี่ยงสิ่งนั้น
Joshua avatar
cn flag
และคุณคิดว่าเขาไม่มี IV ทำไม? (IV จะถูกโหลดเมื่อเพาะ CSPRNG)
kr flag
@Joshua: ประเด็นที่ดี ฉันมองข้าม "CS" และถือว่าเป็น PRNG ปกติหากเป็น CS จริงๆ แม้ว่าจะมีการตั้งค่า seed (รหัสผ่าน) เดียวกัน 1) ลำดับที่สร้างขึ้นในคอมพิวเตอร์เครื่องอื่นจะแตกต่างกัน ดังนั้นจึงเป็นไปไม่ได้ที่จะถอดรหัสข้อความต้นฉบับ 2) แม้ในคอมพิวเตอร์เครื่องเดียวกันหลังจากเริ่มต้น CSPRNG เพื่อถอดรหัส ลำดับที่สร้างขึ้นอาจแตกต่างกัน (เช่น CR PRNG ทำงานใน Java, Class SecureRandom) ดังนั้นจึงเป็นไปไม่ได้ที่จะถอดรหัสข้อความที่เข้ารหัสไว้ก่อนหน้านี้ ดังนั้นรูปแบบใน OP จึงยิ่งแย่ลงไปอีก
Score:1
ธง us

อัลกอริทึมการเข้ารหัสของคุณจะทำงานได้ไม่ดีในบางสถานการณ์จริงตัวอย่างเช่น หากคุณเข้ารหัสดิสก์ด้วยดิสก์ การอ่านไฟล์จากส่วนท้ายของดิสก์จะต้องใช้ CSPRNG เพื่อสร้างตัวเลขสุ่มกิกะไบต์ / เทราไบต์ก่อนที่คุณจะได้รับตัวเลขที่ใช้เข้ารหัสไฟล์นั้น

Score:0
ธง ss

คุณจะต้องผสมองค์ประกอบของการสุ่มที่เกิดขึ้นจริง - หากคุณไม่สร้างเครื่องกำเนิดด้วยตัวเลขสุ่ม ผลลัพธ์ก็จะไม่สุ่มเช่นกันโซลูชันที่คุณอธิบายมีความเสี่ยงต่อ:

  1. การโจมตีพจนานุกรม คุณสามารถสร้างแฮชสำหรับเมล็ดพันธุ์ทั้งหมดสำหรับรหัสผ่านทั่วไป หรือดาวน์โหลด
  2. การโจมตีข้อความธรรมดาที่รู้จัก เนื่องจากเมล็ดพันธุ์ของคุณได้รับการแก้ไข สตรีมแบบสุ่มจึงได้รับการแก้ไข หากคุณทราบข้อความธรรมดาของข้อความหนึ่ง ตอนนี้คุณสามารถถอดรหัสข้อความอื่นๆ ทั้งหมดให้มีความยาวเท่ากันได้ ขึ้นอยู่กับข้อมูลที่คุณส่ง อาจมีข้อความธรรมดามากกว่าที่คุณคิด (เช่น ไฟล์มีเครื่องหมายเฉพาะ เนื่องจากภาษาของข้อความสามารถคาดเดาได้มากกว่าที่คุณคิด)

เคล็ดลับ XOR ทำให้เกิดความสับสนและไม่แพร่กระจายและเปิดให้มีการโจมตีทางสถิติ แม้แต่แผ่นอิเล็กโทรดแบบใช้ครั้งเดียวที่มี XOR เท่านั้นก็ยังมีความเสี่ยงเพียงบางส่วน เช่น. สำหรับข้อความที่ยาวมาก ในทางสถิติ XOR ยังปล่อยให้ 1/256 ของข้อความของคุณไม่มีการเข้ารหัส เนื่องจาก XOR ที่มี 0 ไม่ได้ทำอะไรเลย และ 1/256 จะกลับด้านเนื่องจาก XOR ที่มี 0xff จะเหมือนกับ NOT อีกครั้ง - ขึ้นอยู่กับข้อมูลที่คุณส่ง 1/256 ที่ตรงกันอาจดีพอสำหรับผู้โจมตี (เช่น หากผู้โจมตีต้องการทราบว่าคุณแชร์ไฟล์เฉพาะที่พวกเขาทราบบริบทหรือไม่)

คุณอาจต้องการเกลือ RNG ของคุณด้วยการสุ่มจริงนอกเหนือไปจากแฮช และคุณต้องมีช่องว่างภายในเพื่อให้แน่ใจว่าข้อมูลความยาวจะไม่รั่วไหล

cn flag
ฉันคิดว่าคุณกำลังใช้คีย์ผิด คำถามไม่ได้อยู่ว่ามีการใช้คีย์คงที่หรือการแลกเปลี่ยนคีย์บางประเภทหรือไม่ แน่นอนว่าการสุ่มภายในกระบวนการเข้ารหัสจำเป็นต้องส่งไปยังผู้รับไม่ทางใดก็ทางหนึ่ง (การส่ง IV, กระบวนการแลกเปลี่ยนคีย์ ฯลฯ) และควรสร้างการสุ่มสำหรับคีย์โดยกระบวนการที่ปลอดภัยบางอย่าง ถ้าเป็นไปได้
cn flag
แต่เกี่ยวกับย่อหน้าที่สองของคุณ นั่นไม่เป็นความจริงเลย XOR ที่มี 0 ไม่ได้ทำอะไรเลย - แต่นั่นคือประเด็น ผู้โจมตีไม่ทราบว่าตำแหน่งของคีย์นั้นเป็น XORed ด้วย 0 หรือ 1 (ดูที่บิตเดียว) หากคีย์เป็นแบบสุ่ม สม่ำเสมอ และไม่เคยทำซ้ำ ผู้โจมตีจะไม่สามารถรู้ได้ว่าข้อความส่วนใดถูกพลิกกลับหรือไม่มีการเปลี่ยนแปลงนั่นคือเหตุผลที่แท้จริงว่าทำไมการโจมตีทางสถิติถึงใช้ไม่ได้กับ OTP

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา