การแฮ็นรหัสผ่านโดยใช้ปัญหาที่สมบูรณ์ของ NP


16

อัลกอริทึมการแฮ็นรหัสผ่านที่ใช้กันทั่วไปทำงานในลักษณะนี้วันนี้: ใส่รหัสผ่านและป้อนลงใน KDF ตัวอย่างเช่นการใช้ PBKDF2-HMAC-SHA1 กระบวนการแฮชรหัสผ่านคือDK = PBKDF2(HMAC, Password, Salt, ...)รหัสผ่าน เนื่องจาก HMAC เป็น hashing 2 รอบพร้อมกับแป้นที่มีเบาะรองและ SHA1 เป็นชุดของการเรียงสับเปลี่ยนการหมุนการหมุนและการดำเนินการระดับบิตโดยพื้นฐานกระบวนการทั้งหมดจึงมีการดำเนินการพื้นฐานบางอย่างที่จัดเรียงในลักษณะที่แน่นอน ไม่ชัดเจนว่าเป็นเรื่องยากที่จะคำนวณ นั่นอาจเป็นเหตุผลว่าทำไมฟังก์ชั่นทางเดียวยังคงเป็นความเชื่อและเราได้เห็นฟังก์ชั่นแฮชการเข้ารหัสลับที่มีความสำคัญในอดีตบางอย่างกลายเป็นไม่ปลอดภัยและเลิกใช้แล้ว

ฉันสงสัยว่ามันเป็นไปได้ที่จะใช้ประโยชน์จากปัญหาที่สมบูรณ์ของ NP เพื่อแฮรหัสผ่านในรูปแบบใหม่โดยหวังว่าจะให้พื้นฐานทางทฤษฎีที่มั่นคงยิ่งขึ้น แนวคิดหลักคือสมมติว่า P! = NP (ถ้า P == NP แล้วไม่มี OWF ดังนั้นรูปแบบปัจจุบันจะแตกเช่นกัน) การเป็นปัญหา NPC หมายถึงคำตอบนั้นง่ายต่อการตรวจสอบ แต่ยากที่จะคำนวณ คุณสมบัตินี้เหมาะสมกับข้อกำหนดของการแฮ็กรหัสผ่าน หากเราดูรหัสผ่านเป็นคำตอบของปัญหา NPC เราสามารถเก็บปัญหา NPC ไว้เป็นแฮชของรหัสผ่านเพื่อตอบโต้การโจมตีออฟไลน์: มันง่ายต่อการตรวจสอบรหัสผ่าน แต่ยากที่จะถอดรหัส

ข้อแม้คือรหัสผ่านเดียวกันอาจถูกแมปกับหลายอินสแตนซ์ของปัญหา NPC อาจไม่ใช่ทั้งหมดที่ยากต่อการแก้ไข เป็นขั้นตอนแรกในการวิจัยนี้ฉันพยายามตีความสตริงไบนารีเป็นคำตอบของปัญหา 3-SAT และเพื่อสร้างอินสแตนซ์ของปัญหา 3-SAT ที่สตริงไบนารีเป็นวิธีแก้ปัญหา ในรูปแบบที่ง่ายที่สุดสตริงไบนารีมี 3 บิต: x_0, x_1, x_2 จากนั้นมี 2 ^ 3 == 8 ข้อ:

000 (    (x_0) v    (x_1) v    (x_2) )
--------------------------------------
001 (    (x_0) v    (x_1) v NOT(x_2) )
010 (    (x_0) v NOT(x_1) v    (x_2) )
011 (    (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v    (x_1) v    (x_2) )
101 ( NOT(x_0) v    (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v    (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )

สมมติว่าสตริงไบนารี่เป็น 000 จากนั้นข้อ 1 ใน 8 ข้อเท่านั้นเป็นเท็จ (อันแรก) หากเราละทิ้งประโยคแรกและและส่วนที่เหลืออีก 7 ข้อแล้ว 000 เป็นคำตอบของสูตรผลลัพธ์ ดังนั้นถ้าเราเก็บสูตรจากนั้นเราสามารถตรวจสอบได้ 000

ปัญหาคือสำหรับสตริง 3 บิตหากคุณเห็นประโยคที่ต่างกัน 7 ข้อคุณก็จะรู้ทันทีว่าข้อใดหายไปและนั่นจะเผยให้เห็นบิต

ดังนั้นในภายหลังฉันจึงตัดสินใจทิ้ง 3 รายการโดยเก็บเฉพาะ 4 รายการที่ทำเครื่องหมายไว้ด้วย 001, 010, 100 และ 111 ซึ่งบางครั้งจะแนะนำการชน แต่ทำให้การแก้ปัญหาน้อยลงเล็กน้อย การชนไม่ได้เกิดขึ้นเสมอไป แต่ไม่ว่าพวกมันจะหายไปหรือไม่

แก้ไข ในกรณีทั่วไปที่สตริงไบนารีสามารถเป็นใด ๆ (000, 001, ... , 111) ยังคงมี 8 ข้อที่ 7 เป็นจริงและ 1 เป็นเท็จ เลือก 4 ข้อที่ให้ความจริง (001, 010, 100, 111) นี่สะท้อนให้เห็นในการใช้งานต้นแบบด้านล่าง

แก้ไข ตามคำตอบที่แสดงโดย @DW ด้านล่างวิธีการเลือกคำสั่งนี้อาจยังคงส่งผลให้มีคำสั่งมากเกินไปในชุดของตัวแปรที่กำหนดซึ่งทำให้สามารถ จำกัด ค่าได้อย่างรวดเร็ว มีวิธีอื่นในการเลือกส่วนคำสั่งในข้อ 7 * C (n, 3) ตัวอย่างเช่น: เลือกข้อที่แตกต่างจากชุดของตัวแปรที่กำหนดและทำเฉพาะสำหรับตัวแปรที่อยู่ติดกัน ((x_0, x_1, x_2), (x_1, x_2, x_3), (x_2, x_3, x_4), .. .) และทำให้เกิดวงรอบแทนกลุ่ม วิธีนี้น่าจะใช้งานไม่ได้เช่นกันเพราะคุณสามารถลองการมอบหมายโดยใช้การเหนี่ยวนำเพื่อทดสอบว่าทุกข้อสามารถพอใจได้หรือไม่ ดังนั้นเพื่อให้ง่ายในการอธิบายโครงสร้างโดยรวมลองใช้วิธีการปัจจุบัน

จำนวนอนุประโยคสำหรับสตริง n-bit คือ 4 * C (n, 3) = 4 * n * (n - 1) * (n - 2) / 6 = O (n ^ 3) ซึ่งหมายถึงขนาดของhashคือพหุนามของขนาดรหัสผ่าน

มีการดำเนินงานต้นแบบในหลามเป็นที่นี่ มันสร้างอินสแตนซ์ปัญหา 3-SAT จากสตริงไบนารี่อินพุตของผู้ใช้


หลังจากการแนะนำที่ยาวนานนี้ในที่สุดคำถามของฉัน:

  1. โครงสร้างด้านบน (ตามที่นำมาใช้ในต้นแบบ) ทำงานเป็น hashing รหัสผ่านที่ปลอดภัยหรืออย่างน้อยก็ดูมีแนวโน้มที่สามารถแก้ไขได้ ฯลฯ ? ถ้าไม่มันล้มเหลวที่ไหน?

  2. เนื่องจากเรามี 7 * C (n, 3) ส่วนคำสั่งให้เลือกเป็นไปได้หรือไม่ที่จะหาวิธีอื่นในการสร้างอินสแตนซ์ 3-SAT ที่ปลอดภัยเหมาะสำหรับใช้เป็นแฮชรหัสผ่านอาจเป็นไปได้ด้วยการสุ่ม

  3. มีงานใดที่คล้ายกันที่พยายามยกระดับความสมบูรณ์ของ NP เพื่อออกแบบแผนการแฮ็ชรหัสผ่านที่ปลอดภัยและได้รับผลลัพธ์บางอย่างแล้ว (ทั้งบวกหรือลบ)? ยินดีต้อนรับสู่ intros และลิงค์บางอย่าง


แก้ไข ฉันยอมรับคำตอบด้านล่างโดย @DW ซึ่งเป็นคนแรกที่ตอบและให้ข้อมูลเชิงลึกเกี่ยวกับโครงสร้างปัญหารวมถึงทรัพยากรที่มีประโยชน์ รูปแบบการเลือกประโยคไร้เดียงสาที่แนะนำที่นี่ (ตามที่นำมาใช้ในต้นแบบ Python) ดูเหมือนจะไม่ทำงานเพราะมันเป็นไปได้ที่จะ จำกัด การกำหนดตัวแปรในกลุ่มเล็ก ๆ อย่างรวดเร็ว อย่างไรก็ตามปัญหายังคงเปิดอยู่เพราะฉันไม่ได้เห็นการพิสูจน์อย่างเป็นทางการที่แสดงว่าการลดลงของรหัสผ่านการแฮ็ช NPC เป็นรหัสผ่านดังกล่าวจะไม่ทำงานเลย แม้แต่ปัญหาการลด 3-SAT นี้โดยเฉพาะอาจมีวิธีการเลือกคำสั่งต่าง ๆ ที่ฉันไม่ต้องการระบุที่นี่ ดังนั้นการปรับปรุงและการสนทนาใด ๆ ยังคงยินดีอย่างมาก


ผมเสียบรุ่นประโยคของคุณไปนั่งแก้ (picosat ใช้ pycosat) ที่นี่ สำหรับ nbits = 300 ที่ยาวที่สุดคือการสร้างคำสั่ง pycosat จะฆ่าอินสแตนซ์ ฉันไม่ได้ไปมากกว่า 300 เพราะรุ่นประโยคของคุณยาวมากจริง ๆ นอกจากนี้ 0 ... 0 คือมักจะแก้ปัญหาในการผลิตของคุณ หากคุณมีวิธีแก้ปัญหาที่ 'ง่าย' อยู่เสมอสิ่งนี้จะไม่ทำงาน
holf

คำตอบ:


17

น่าเสียดายที่สิ่งนี้ดูเหมือนจะไม่ทำงาน (ดูรายละเอียดด้านล่าง) และดูเหมือนยากที่จะหาวิธีในการทำให้ความคิดประเภทนี้มีรูปแบบที่ปลอดภัย

ปัญหาเกี่ยวกับความคิดทั่วไปของคุณ

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

ฉันขอแนะนำให้อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ คุณสามารถหาจุดเริ่มต้นที่เป็นประโยชน์ได้ที่ความสำคัญของปัญหา NP-Hard ในวิทยาการเข้ารหัสลับ , ปัญหาที่ซับซ้อนโดยเฉลี่ยในกรณีเปิดปัญหาอื่น ๆ นอกเหนือจากฟังก์ชั่นทางเดียว , สถานะของโลกแห่ง Impagliazzo? , กรณีที่เลวร้ายที่สุดที่จะลดกรณีเฉลี่ย

ปัญหาเกี่ยวกับรูปแบบเฉพาะของคุณ

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

x0,x1,x2,x3,x425การมอบหมายที่เป็นไปได้สำหรับตัวแปร 5 ตัวนั้นดังนั้นให้ลองทั้งหมดและละทิ้งการกำหนดค่าใด ๆ ที่ละเมิดโดย 40 ข้อ ฉันคาดการณ์ว่าสิ่งนี้จะทำให้คุณมีการมอบหมายเพียงประมาณหนึ่งข้อที่สอดคล้องกับคำสั่งทั้งหมด

1/21/21025-17/8(7/8)402-7.7(25-1)×2-7.70.15

สิ่งนี้สามารถทำซ้ำได้สำหรับแต่ละกลุ่มของตัวแปร 5 ตัวโดยการกู้คืนการกำหนดค่าที่ไม่ซ้ำกันที่น่าพอใจสำหรับแต่ละกลุ่ม หากมีความกำกวมใด ๆ การมอบหมายผู้สมัครสามารถตรวจสอบกับข้ออื่น ๆ ได้

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


มีการใช้งานอ้างอิงที่ทำหน้าที่เป็นข้อมูลจำเพาะเต็ม ในความพยายามครั้งแรกรูปแบบนั้นง่ายมาก ฉันเพียงแค่เลือก 4 ข้อที่ให้ 001, 010, 100 และ 111 เมื่อแทนที่ด้วยรหัสผ่าน สิ่งนี้จะให้การรวมกันที่ถูกต้อง 4 จาก 8 สำหรับแต่ละข้อ
Cyker

คุณอาจพูดถูกว่าคำว่าด่วนนี้มีส่วนคำสั่งมากเกินไปซึ่งทำให้การแก้ปัญหาแคบลงอย่างรวดเร็ว อย่างไรก็ตามเราเริ่มต้นด้วย O (n ^ 3) ข้อและเรามีอิสระที่จะเลือก แฝดสามอาจไม่เป็นอิสระ ดังนั้นฉันจึงสงสัยว่าจะเลือกประโยคที่มีรูปแบบที่พยายามลบอินสแตนซ์ปัญหาที่ง่ายหรือไม่ไม่ว่าการวิเคราะห์ฮิวริสติกของคุณจะยังคงอยู่หรือไม่
Cyker

1
แต่สิ่งที่น่าสนใจกว่านั้นคือพูดอย่างคร่าว ๆ เราไม่มีปัญหากรณี NPC เฉลี่ย
Cyker

1
@Cyker คุณพูดถูก พูดอย่างเคร่งครัดคุณไม่สามารถเพิ่มความน่าจะเป็นทวีคูณได้เนื่องจากไม่มีการรับรองว่าความน่าจะเป็นจะเป็นอิสระ นั่นเป็นเพียงฮิวริสติกที่พยายามทำนายว่าอัลกอริทึมอาจทำงานได้ดีเพียงใด ฮิวริสติกอาจผิด การทดสอบขั้นสุดท้ายคือการใช้อัลกอริทึมและดูว่ามันใช้งานได้หรือไม่
DW

2
การทดสอบอย่างรวดเร็วอย่างหนึ่งอาจลองใช้อินสแตนซ์ของคุณบนตัวแก้ SAT ฉันคิดว่า SAT Solvers จะมีประสิทธิภาพสำหรับอินสแตนซ์ของคุณ แต่ฉันไม่ได้พยายามเข้าใจสเป็คของคุณอย่างเต็มที่ พยายามที่จะสร้างอินสแตนซ์ 10000 ตัวแปรและเรียกใช้ SAT Solver (โดยวิธีการโดยไม่มีช่องว่าง / เกลือรหัสผ่านจะมีขนาดเล็กมาก ... )
holf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.