การแลกเปลี่ยนคีย์ RSA

Aug 19 2020

ฉันต้องการสร้างโปรแกรมแลกเปลี่ยนข้อความ ข้อความเหล่านี้เข้ารหัสด้วยคีย์ AES และคีย์นี้เข้ารหัสโดยใช้อัลกอริทึม RSA เมื่อฉันส่งข้อความจากผู้ใช้ 1 ไปยังผู้ใช้ 2 ฉันจำเป็นต้องขอคีย์สาธารณะจากผู้ใช้ 2 ฉันเพียงแค่ได้รับคีย์และใช้มันหรือฉันต้องการการแลกเปลี่ยนคีย์ที่ปลอดภัยเช่น Deffie Hellman หรืออย่างอื่น? ถ้าคำตอบคือใช่ฉันจะใช้อัลกอริทึม deffie-Hellman เพื่อส่งคีย์สาธารณะ RSA นี้ได้อย่างไร สิ่งที่ฉันอ่านว่าอัลกอริทึมของ Hellman สร้างคีย์สาธารณะและคีย์ส่วนตัวของตัวเองและทั้งสองขึ้นอยู่กับมันฉันจะส่งคีย์สาธารณะ RSA ได้อย่างไร

คำถามที่สองคือฉันเข้ารหัสโดยใช้อัลกอริทึม AES เท่านั้นหรือไม่และที่นี่ฉันต้องส่งคีย์สาธารณะจากผู้ส่งไปยังผู้รับแน่นอนว่าฉันต้องการสื่อที่ปลอดภัยในการโอนคีย์เช่นอัลกอริทึมของ Deffie Hellman แต่อย่างที่ฉันได้กล่าวไปก่อนหน้านี้ว่าอัลกอริทึมนี้สร้างคีย์สาธารณะและคีย์ส่วนตัวของตัวเอง แต่ฉันมีคีย์สาธารณะ AES อยู่แล้ว มีวิธีส่งคีย์สาธารณะ AES ไปยัง deffie hellman หรือไม่? โปรดช่วยฉันด้วยฉันสับสนเกี่ยวกับเรื่องนั้นจริงๆ

คำตอบ

20 Z.T. Aug 19 2020 at 01:25

TL; DR: ข้ามไปที่ "การใช้ผลลัพธ์ของ DH"

เนื่องจากคุณเริ่มต้นด้วย "ฉันต้องการสร้างโปรแกรมแลกเปลี่ยนข้อความ" ร่วมกับ "ฉันไม่รู้วิธีใช้ DH" คำนำที่น่าเบื่อ:

ความปลอดภัย

ผู้คนเชื่อความลับในการรักษาความปลอดภัยระบบข้อมูลและเมื่อระบบเหล่านั้นกลายเป็นระบบที่ไม่ปลอดภัยผู้คนได้รับบาดเจ็บและเสียชีวิตในบางครั้ง เราต้องการระบบที่ปลอดภัยซึ่งยากที่จะทำลายแม้กระทั่งกับฝ่ายตรงข้ามที่มีอำนาจ

จะเกิดอะไรขึ้นถ้าระบบของคุณไม่ได้มีไว้เพื่อปกป้องสิ่งใดจากฝ่ายตรงข้ามที่มีอำนาจ? แล้วทำไมคุณถึงสร้างระบบที่เป็น Messenger ด้วย RSA และ AES? เห็นได้ชัดว่าต้องโฆษณาว่าปลอดภัย อย่าโฆษณาอะไรบางอย่างว่าปลอดภัยเมื่อไม่ปลอดภัยเพราะคนจะเชื่อความลับแล้วพวกเขาจะได้รับบาดเจ็บ

คุณคิดว่าระบบของคุณปลอดภัยหรือไม่? มันไม่ใช่. คำจำกัดความของคำว่า "ปลอดภัย" คือ "คนจำนวนมากที่มีประวัติที่ดีในการทำลายระบบที่เทียบเคียงกันได้พยายามทำลายระบบนี้มานานแล้วและไม่มีที่ไหนเลย" เนื่องจากการโจมตีจะดีขึ้นเรื่อย ๆ แม้แต่ปัญหาที่ไม่ได้นำไปสู่การหยุดชะงักในทันทีทำให้ระบบเสียหรืออย่างน้อยก็ไม่แนะนำ

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

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

วิธีดั้งเดิมในการให้นักเข้ารหัสทำงานทำลายระบบของคุณได้ฟรีคือการได้รับปริญญาขั้นสูงในการเข้ารหัส (หรือเทียบเท่า) เผยแพร่ช่วงพัก (หรืออย่างน้อยผลลัพธ์ที่เผยแพร่ได้) ในวารสารและการประชุม (พวกเขายอมรับเอกสารที่ดีโดยไม่ทราบสาเหตุ) กลายเป็น นักเข้ารหัสที่รู้จักแล้วเผยแพร่การออกแบบของคุณเองเพื่อให้คนอื่นทำลาย การแข่งขันเช่นNIST LWCเป็นสถานที่ที่ดี

เพื่ออะไร?

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

คุณพูดถึง RSA และ AES

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

RSA

RSA ล้าสมัย ไม่ได้ใช้ในการออกแบบใหม่ มีปัญหาหลายประการ:

  • มันเสี่ยง footgun ในรูปแบบของ "การเข้ารหัสคีย์สาธารณะ" ซึ่งเชิญชวนให้คนที่จะสร้างระบบได้โดยไม่ต้องPFS

  • จำเป็นต้องมีการรักษาความปลอดภัยหลายบิตซึ่งทำให้ไม่มีประสิทธิภาพ เพื่อให้ได้ความปลอดภัย 256 บิตคุณต้องมีบิตจำนวนมากในทางปฏิบัติ

  • มีการระบุไว้ต่ำกว่ามาตรฐานดังนั้นคุณจะไม่พบ RSA API ที่ทนทานต่อการใช้งานในทางที่ผิดซึ่งทำให้การตัดสินใจด้านความปลอดภัยทั้งหมดสำหรับคุณ (เช่น Public exponent? PKCS # 1 v1.5? PSS salt length? MGF1 hash function?)

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

RSA แทนที่อะไร? อันดับแรกNIST P-256 ECDH , ECDSAและECIES ในช่วงต้นศตวรรษที่ 21จากนั้นจึงX25519และEd25519ในราวปี 2555

AES

AES มีความปลอดภัยเมื่อดำเนินการได้ดีในฮาร์ดแวร์หรือเมื่อคุณใช้ช้า ( แต่ปลอดภัย) การดำเนินงาน bitslicing การใช้งาน AES อย่างรวดเร็วในซอฟต์แวร์มักจะทำให้กุญแจรั่วผ่านช่องทางด้านข้าง ชิป Intel มี AES ที่ดีเป็นเวลา10 ปีดังนั้นปัญหาจึงได้รับการแก้ไข มีข้อแม้ว่า: " ถ้าคุณต้องพิมพ์ตัวอักษร" AES "ลงในซอร์สโค้ดของคุณคุณกำลังทำผิด "

AES เป็นรหัสบล็อกวิธีเดียวที่จะใช้ใน "โหมดการทำงาน" ( มีให้เลือกมากมาย! ) ผู้ที่ต้องการ IV ใหม่ ( TLS ทำผิด! ) หรือ nonces ซึ่งคุณต้องไม่ทำซ้ำ ( ไซต์ TLS ของ GCHQ ทำผิด! ) และอาจเป็นช่องว่าง ( padding oraclesเป็นคลาสสิกและการเข้ารหัส go aws s3 sdk ทำผิด! ) หลังจากนั้นการเข้ารหัสจะอ่อนลงดังนั้นคุณต้องเพิ่มการตรวจสอบข้อความ ( iMessage ทำ มันผิด! ) จากนั้นคุณต้องรวมการเข้ารหัสและการตรวจสอบความถูกต้องอย่างถูกต้อง ( TLS ทำผิด! ) จากนั้นคุณต้องตรวจสอบแท็กการตรวจสอบความถูกต้องในเวลาคงที่ ฯลฯ เป็นต้น

วิธีการที่ปัญหาเหล่านี้ได้รับการแก้ไขโดยทุกคนคือการใช้AEAD สิ่งที่ได้รับความนิยมมากที่สุดคือ AES- GCM (เนื่องจากเร็วที่สุดในบรรดารุ่นที่ไม่ได้รับการจดสิทธิบัตร ) แต่ต้องใช้การสนับสนุนฮาร์ดแวร์และง่ายต่อการเลอะดังนั้นฉันขอแนะนำให้ใช้ChaCha20-Poly1305 (หรือXChaChaซึ่งจะดีกว่า) ทั้งสองตัวเลือกคือสิ่งที่ TLS, SSH และ IPSec มาบรรจบกัน WireGuardซึ่งเป็นอุปกรณ์ทดแทนที่ทันสมัยสำหรับ IPSec นำเสนอ ChaPoly เท่านั้นเพื่อความปลอดภัยเพิ่มเติมโดยการกำจัดการเจรจาต่อรองชุดรหัส

DH และ PFS ล่ะ?

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

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

ด้วย TLS หมายความว่าคีย์สำหรับใบรับรองจะมีค่าแม้กระทั่งหลายปีหลังจากใบรับรองหมดอายุและไม่สามารถใช้สำหรับการแอบอ้างบุคคลอื่นได้

ไม่แนะนำให้ใช้ PGP / GPG โดยผู้เชี่ยวชาญด้าน infosec HTTP / 2 ไม่อนุญาตชุดการเข้ารหัส TLS ที่ไม่ใช่ PFS ในปี 2015 และ TLS 1.3 ได้ลบชุดการเข้ารหัสที่ไม่ใช่ PFS ออกในปี 2018 AFAIK, SSH ไม่เคยใช้โดยไม่มี PFS

วิธีนี้ได้รับการแก้ไขและวิธีรับ PFS โดยใช้DHก่อน แต่ละด้านจะสร้างคีย์คู่แบบใช้ครั้งเดียวใหม่ (เรียกว่า "ชั่วคราว") ซึ่งไม่ได้เชื่อมโยงกับข้อมูลประจำตัวใด ๆ และจะแลกเปลี่ยนคีย์สาธารณะในช่องว่าง จากนั้นหนึ่งจะคำนวณ "g ^ (ab) mod p" และอีกตัวคำนวณ "g ^ (ba) mod p" และทั้งสองค่าจะเหมือนกันและไม่มีใครที่เห็นการแลกเปลี่ยนสามารถทราบตัวเลขนี้ได้ นี่เป็นเคล็ดลับมายากลโดยทั่วไปผู้คนต้องใช้เวลานานกว่าจะเชื่อว่าการเข้ารหัสแบบไม่สมมาตรเป็นไปได้

โดยใช้ผลของ DH

ผลลัพธ์ของการแลกเปลี่ยนคีย์ DH ไม่ใช่อาร์เรย์ที่สม่ำเสมอของบิตที่มีความยาวเฉพาะที่คุณต้องใช้ AEAD ดังนั้นคุณจึงส่งค่านี้ผ่าน KDF ( HKDFนั้นดี) และแยกไบต์ได้มากเท่าที่คุณต้องการ ตัวอย่างเช่น 32 ไบต์แรกคือคีย์การส่งของไคลเอ็นต์และ 32 ไบต์ถัดไปคือคีย์การส่งของเซิร์ฟเวอร์ ไคลเอนต์คือฝั่งที่เริ่มการเชื่อมต่อเครือข่ายหรือส่งข้อความ เซิร์ฟเวอร์ใช้คีย์ของไคลเอ็นต์เพื่อถอดรหัสข้อความของไคลเอ็นต์และคีย์ของตัวเองเพื่อเข้ารหัสการตอบกลับ

ตอนนี้นี่คือช่องทางที่ปลอดภัยแบบไม่ระบุตัวตน ไม่มีใครรู้ว่ามีอะไรอยู่ข้างใน แต่ทั้งสองฝ่ายไม่รู้ว่ากำลังคุยกับใคร กุญแจที่พวกเขาใช้ไม่ได้เชื่อมโยงกับสิ่งใดเลยและอาจเป็นแบบแมน - อิน - เดอะ - มิดเดิลและพวกเขาไม่มีทางรู้ได้ สิ่งแรกที่พวกเขาควรทำโดยใช้ช่องนี้คือการใช้การตรวจสอบสิทธิ์แบบไม่สมมาตรเพื่อตรวจสอบว่าพวกเขากำลังคุยกับคนที่ถือรหัสประจำตัวระยะยาวที่พวกเขาคาดหวัง (หรือรหัสประจำตัวระยะยาวนั้นรับรองโดยคนที่พวกเขาไว้วางใจเช่นในPKI ) ซึ่งสามารถทำได้โดยใช้ลายเซ็นดิจิทัล (ตามปกติ) หรือใช้ DH และ HMAC แบบที่ Noise Protocol Framework ทำ

หลังจากดำเนินการตรวจสอบสิทธิ์แล้วพวกเขาสามารถแลกเปลี่ยนข้อความปกติได้

โปรดทราบว่าวิธีดำเนินการของ PGP ไม่จำเป็นต้องมีข้อความไปกลับหรือให้ผู้รับออนไลน์ DH แบบธรรมดาต้องใช้การเดินทางไปกลับและกำหนดให้ทั้งสองฝ่ายออนไลน์พร้อมกัน ผู้รับสามารถหลีกเลี่ยงการเดินทางไปกลับได้โดยการเผยแพร่คีย์สาธารณะ DH ที่มีลายเซ็นจำนวนมากบนเซิร์ฟเวอร์ซึ่งผู้ส่งสามารถใช้เพื่อเข้ารหัสข้อความและจัดเก็บไว้บนเซิร์ฟเวอร์เพื่อให้ผู้รับดึงข้อมูลเมื่อกลับมาออนไลน์ นี่คือสิ่งที่Signal ทำ (รวมถึง whatsapp) เสียงรบกวนพิธีสารกรอบเนื้อหาพวงของ "รูปแบบ" และคุณสมบัติที่คุณจะได้รับในการแลกเปลี่ยนสำหรับรอบการเดินทางมากขึ้น

Classic DH ในปัจจุบันเรียกว่าFFDHEมีปัญหาบางอย่างเช่นเดียวกับ RSA และถูกแทนที่โดย NIST P-256 ECDH และต่อมาโดย X25519 แต่แนวคิดก็ทำงานในลักษณะเดียวกัน

สร้างอย่างไร?

บางครั้งผู้คนที่เรียนรู้ที่จะไม่ม้วนแบบดั้งเดิมของการเข้ารหัสลับของตนเองบางครั้งก็ใช้โปรโตคอลการเข้ารหัสของตัวเองจากนั้นในการเชื่อมต่อระหว่างสิ่งดั้งเดิมที่มีความปลอดภัยอื่น ๆ พวกเขาจะสร้างบั๊กบนเกม

เราควรทำอย่างไรแทนการกลิ้งของเราเอง? ใช้วิธีแก้ปัญหานอกกรอบที่ดีระดับที่สูงขึ้นก็จะยิ่งดีขึ้น หากคุณสามารถใช้ WireGuard หรือกำหนดค่า TLS หรือ SSH ได้อย่างถูกต้อง (ปิดใช้งานความเข้ากันได้แบบย้อนหลังทั้งหมดและปล่อยให้มีตัวเลือกที่ปลอดภัยเพียงตัวเดียว) หรืออายุและการกำหนดขั้นต่ำคุณควรทำเช่นนั้น

หากคุณมีการใช้ห้องสมุด, การใช้libsodiumหรือGoogle Tink ทั้งสองพยายามอย่างเต็มที่เพื่อให้มี API ที่ใช้งานยากอย่างไม่ปลอดภัย

หากคุณใช้สิ่งเหล่านี้และไม่ได้ใช้การเข้ารหัสใด ๆ นอกเหนือจากสิ่งที่อยู่ภายในสิ่งเหล่านั้นคุณมีโอกาสสูงมากที่จะไม่มีปัญหาการเข้ารหัสที่สำคัญ

ผู้ส่งสารที่ปลอดภัย

สมมติว่าเราได้แก้ปัญหาในการแลกเปลี่ยนข้อความ แอพ Secure Messenger มีคุณสมบัติมากกว่านั้น

หากผู้ใช้มีบัญชีที่สามารถกู้คืนได้หลังจากทำอุปกรณ์หายการกู้คืนรหัสผ่าน (หรือเทียบเท่า) เป็นวิธียอดนิยมในการรับข้อบกพร่องจากการเล่นเกม

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

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

การแชทเป็นกลุ่มมีความซับซ้อนมากขึ้นเนื่องจากคุณต้องคีย์ใหม่เมื่อสมาชิกกลุ่มเปลี่ยน

หากคุณต้องการให้เซิร์ฟเวอร์จัดเก็บรายชื่อผู้ติดต่อของผู้ใช้นี่เป็นปัญหาความเป็นส่วนตัว การจัดเก็บความเป็นสมาชิกกลุ่มบนเซิร์ฟเวอร์เป็นปัญหาด้านความเป็นส่วนตัว การจัดเก็บโปรไฟล์ผู้ใช้บนเซิร์ฟเวอร์เป็นปัญหาด้านความเป็นส่วนตัว

แอพ Messenger ต่างๆแก้ปัญหาเหล่านี้ด้วยวิธีต่างๆ

คุณควรศึกษาเอกสารรายงานของSignal Protocolเพื่อเรียนรู้ถึงความทันสมัย

โปรดอ่านข้อมูลให้มากขึ้นก่อนที่จะนำสิ่งที่สำคัญไปใช้โดยไม่ได้ตั้งใจ

การเปิดกว้างต่อผู้คนและแนวคิดใหม่ ๆ

จะเป็นอย่างไรถ้าคุณมีความคิดที่ยอดเยี่ยมและฉันจะไม่พบเพราะฉันไม่สนใจว่าคุณขาดความรู้เกี่ยวกับสถานะปัจจุบันของศิลปะ? นั่นเป็นปัญหาหนัก ผู้คนจะไม่เสียเวลาเพื่อเรียนรู้เกี่ยวกับแนวคิดใหม่ ๆ ที่ยอดเยี่ยมของคุณเว้นแต่คุณจะแสดงให้เห็นก่อนว่าคุณรู้เพียงพอเกี่ยวกับแนวคิดที่มีอยู่