Score:1

ความรับผิดชอบของการแลกเปลี่ยนคีย์

ธง us

ฉันใช้การแลกเปลี่ยนคีย์แบบอสมมาตรเพื่อสร้างคีย์แบบสมมาตร

คำถามของฉันเป็นคำถามเชิงปรัชญา/กฎหมายมากกว่าในแง่ของความรับผิดชอบในการแลกเปลี่ยนคีย์ และจะเกิดอะไรขึ้นเมื่อสมมติว่ามีการใช้คีย์ที่รู้จักกันทั่วไป

ฉันต้องการตั้งค่าตัวแปรพื้นฐานเหล่านี้:

  • ไคลเอนต์มีคีย์สาธารณะของเซิร์ฟเวอร์ฮาร์ดโค้ดในหน่วยความจำ
  • เซิร์ฟเวอร์มีไพรเวตคีย์ฮาร์ดโค้ดในหน่วยความจำ
  • มีฮาร์ดโค้ด nonce_size
  • มีฮาร์ดโค้ด public_key_size
  • มีฮาร์ดโค้ด mac_size

ขั้นตอนการสื่อสารเพื่อแลกเปลี่ยนมีดังนี้

  1. หลังจากการเชื่อมต่อ TCP สำเร็จ ลูกค้าจะสร้างรหัสสาธารณะใหม่ client_pubkeyเข้ารหัสรหัสสาธารณะของตัวเอง client_pubkey ใช้ nonce ใหม่ temp_nonce_1 และฮาร์ดโค้ด server_pubkeyและส่งข้อความโดยที่ไบต์แรกคือ nonce และที่เหลือคือการเข้ารหัส client_pubkey (รวมถึง mac ด้วย) นี้มีขนาดที่รู้จักของ nonce_size + public_key_size + mac_size.
  2. เซิร์ฟเวอร์ได้รับข้อความ กำลังตรวจสอบขนาดพอดี nonce_size + public_key_size + mac_size. หากเป็นเช่นนั้น จะถือว่าเป็นการแลกเปลี่ยนคีย์ มันถอดรหัสลับ public_key จากนั้นเซิร์ฟเวอร์จะสร้างใหม่ สมมาตร_คีย์และส่งข้อความกลับโดยมี nonce ใหม่ tmp_nonce2และคีย์สมมาตร + mac เข้ารหัสโดยใช้ที่ได้รับ client_pubkey.
  3. ลูกค้าได้รับข้อความนี้ ทราบแน่ชัดว่าควรมีขนาดเท่าใด มิฉะนั้นจะปฏิเสธ ขณะนี้ไคลเอนต์มีคีย์สมมาตรที่จะใช้
  4. เซิร์ฟเวอร์และไคลเอนต์สื่อสารผ่านคีย์สมมาตร

ดังนั้นนี่คือความพยายามของฉันในการทำความเข้าใจว่าเหตุใดจึงปลอดภัย:

  1. ในกรณีที่มีการส่งไบต์ขยะแบบสุ่มไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะสร้างคีย์ เข้ารหัสคีย์โดยใช้ขยะ สร้างขยะเพิ่ม แล้วจึงส่งข้อมูลนั้น ดังนั้นในความเป็นจริง เราได้ส่งขยะออกไปมากขึ้น และจากนั้นเราก็ไม่ได้รับข้อความที่ถูกต้องและหมดเวลาในที่สุด เป็นการปิดการเชื่อมต่อ ข้อเสียเพียงอย่างเดียวคือเสียเวลา CPU ไปสองสามวินาที
  2. ไคลเอ็นต์ส่ง public_key เฉพาะค่าศูนย์ (หรือบิตเซ็ตที่ชัดเจนอื่นๆ เช่น 1 ทั้งหมด) และค่า nonce ที่ถูกต้อง (หรือศูนย์ด้วย) ในกรณีนี้ เซิร์ฟเวอร์ถือว่าศูนย์เป็นคีย์สาธารณะ และส่งคีย์สมมาตรที่เข้ารหัสผ่านคีย์สาธารณะที่เป็นศูนย์ อย่างไรก็ตาม การดำเนินการนี้ยังคงปลอดภัยเนื่องจากการมีรหัสสาธารณะเป็นเลขศูนย์ถือว่าคุณทราบรหัสส่วนตัวที่ระบุว่าได้รหัสเป็นศูนย์จาก public_key ซึ่งอาจใช้เวลาหลายพันล้านปีในการวิศวกรรมย้อนกลับ ดังนั้นจึงยังปลอดภัย
  3. สมมติว่าไคลเอนต์และเซิร์ฟเวอร์สามารถรีสตาร์ทกระบวนการนี้ได้อย่างไร้ขีดจำกัด (และไม่มีขีดจำกัด x-try บนเซิร์ฟเวอร์) สมมติว่าโชคที่คำนวณไม่ได้และการสุ่มส่งไบต์แบบสุ่ม การแลกเปลี่ยนคีย์เกิดขึ้น และข้อความที่ถูกต้องของข้อมูลใดก็ตามที่เซิร์ฟเวอร์เป็น เซิร์ฟเวอร์ส่งและแยกวิเคราะห์ความคาดหวัง เราโยนแขนขึ้นไปในอากาศเพราะเข้าถึงได้ยากและโดยพื้นฐานแล้ว อึเกิดขึ้น.
    • ในกรณีนี้ เราไม่สามารถบอกว่าใครต้องรับผิดได้ ? ไม่มีอะไรที่เซิร์ฟเวอร์สามารถทำได้เกี่ยวกับการรู้ว่าเป็นแพ็กเก็ตที่เป็นอันตราย
    • แม้ว่าเราจะมีขีดจำกัด x-retry ที่ 2 ครั้ง แต่ในทางทฤษฎีแล้ว มันสามารถเกิดขึ้นได้ในการเชื่อมต่อครั้งแรกจากที่อยู่ IP และอีกครั้งที่เราทำอะไรไม่ได้

โดยพื้นฐานแล้วทุกอย่างปลอดภัยเพราะพื้นฐานของข้อความแรกนั้นคาดว่าจะได้รับการเข้ารหัสโดย public_key ซึ่งมีเพียงเซิร์ฟเวอร์เท่านั้นที่ควรรู้ private_key ที่ตรงกันใช่ไหม และในกรณีที่บางสิ่งไม่สามารถผ่านพ้นไปได้ ผลลัพธ์ก็ถูกโยนทิ้งไปอย่างไม่มีกำหนด?

ฉันขอโทษถ้านี่เป็นเรื่องสั้น ฉันแค่พยายามตรวจสอบทั้งความเข้าใจของฉันเกี่ยวกับทฤษฎีและตรวจสอบให้แน่ใจว่าไม่มีข้อผิดพลาดในการนำโปรโตคอลดังกล่าวไปใช้

Maarten Bodewes avatar
in flag
ฉันไม่เข้าใจ ทำไมเข้ารหัสบางอย่างด้วย nonce แล้วส่ง nonce พร้อมกับข้อความเข้ารหัส จุดประสงค์ของมันคืออะไร?
fgrieu avatar
ng flag
นอกจากนี้ จะถือว่าการเข้ารหัสที่ใช้เป็นแบบรักษาขนาด แต่การเข้ารหัสแบบรักษาขนาดใดๆ นั้นถูกกำหนดไว้แล้ว ดังนั้น จึงล้มเหลวภายใต้การทดสอบการจำแนก CPA แม้ว่านั่นจะไม่ใช่ปัญหา แต่ก็ช่วยขจัดสิ่งทั่วไปในการก่อสร้างออกไป
DeathDream avatar
us flag
@MaartenBodewes จากสิ่งที่ฉันเข้าใจ จุดประสงค์ของ nonce คือการทำให้ข้อความที่ตามมาด้วยคีย์เดียวกันไม่สามารถค้นพบ "บล็อก/คอมโพเนนต์" ทั่วไปในข้อความที่เข้ารหัส และใช้สิ่งนั้นในการถอดรหัสการโจมตีแต่ในกรณีของการแลกเปลี่ยนคีย์ที่ใช้คีย์สาธารณะที่เข้ารหัสแบบตายตัวเพื่อสร้างคีย์สาธารณะใหม่ และเซิร์ฟเวอร์ถอดรหัสข้อความหนึ่งครั้ง (โดยใช้คีย์ส่วนตัว) และเข้ารหัสคีย์แบบสุ่มอีกครั้ง nonce อาจไม่มีประโยชน์ในเรื่องนี้ กรณีที่ฉันเดา? ฉันเดาว่าเราต้องพึ่งพาลูกค้าโดยไม่ประนีประนอมกับตัวเอง?
DeathDream avatar
us flag
@fgrieu ในโลกแห่งความเป็นจริงเราต้องบังคับใช้ข้อ จำกัด ขนาดบางรูปแบบใช่ไหม ตัวอย่างเช่น หากเรากำลังเข้ารหัสข้อความใน UDP Land และเราถูกจำกัดให้ส่งแพ็กเก็ตที่มีขนาดข้อความไม่เกิน 512 ไบต์ เราจึงรับประกันได้ว่าจะสามารถจัดส่งได้ (ซึ่งจากที่ฉันเข้าใจว่าเป็นขีดจำกัดขนาดสูงสุดเพียงอย่างเดียวที่เราสามารถรับประกันได้ เว้นแต่คุณจะ อยู่ในที่ดิน ipv6) จากนั้นเราจะมีขนาดสูงสุด 512 ไบต์เท่านั้นที่จะใช้งานได้ ไม่ว่าการเข้ารหัสจะคงขนาดไว้หรือไม่ก็ตาม จะต้องมีการรับประกันความแตกต่างของขนาดสูงสุดให้พอดีภายใน 512 - ไบต์ขนาดข้อความ
SAI Peregrinus avatar
si flag
นี่เป็นโปรโตคอล *แปลกจริงๆ* จะเกิดอะไรขึ้นหากข้อความที่ถูกต้องมีความยาวเท่ากับ `nonce_size + public_key_size + mac_size` คุณเข้ารหัสสิ่งต่าง ๆ ด้วยคีย์อสมมาตรได้อย่างไร นั่นไม่ใช่เรื่องปกติ โดยปกติจะใช้ KEM หรือการแลกเปลี่ยนคีย์ที่เหมือน Diffie-Hellman (ส่วนใหญ่มักจะเป็น ECDHE) เหตุใดข้อความ 1 จึง "เข้ารหัส" เลย ในเมื่อข้อมูลทั้งหมดที่เข้าสู่คีย์เข้ารหัสเปิดเผยต่อสาธารณะ คุณเคยเห็น [Noise protocol framework](https://noiseprotocol.org) แล้วหรือยัง ถ้าเป็นเช่นนั้น ทำไมคุณไม่ใช้สิ่งนั้นในการออกแบบโปรโตคอลที่เหมาะสม
SAI Peregrinus avatar
si flag
สำหรับเรื่องนั้น ทำไมคุณไม่ใช้ TLS 99% ของเวลา การเข้ารหัสการขนส่งไปยังเซิร์ฟเวอร์ TLS เป็นสิ่งที่คุณต้องการ

โพสต์คำตอบ

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