ฉันกำลังจะผ่านลายเซ็น Lamport Diffie One-time
เป็นหมายเหตุด้านข้าง งานนี้เป็นความพยายามในช่วงแรกที่ถึงจุดสูงสุดในสิ่งที่เรียกว่า "วิธีลายเซ็นตามสถานะแฮช"; การออกแบบที่ทันสมัย ได้แก่ เอ็กซ์เอ็มเอส และ ลสและใกล้เคียงกับสิ่งที่อยู่ในเอกสารของ Merkle อย่างน่าประหลาดใจ คุณอาจพบว่าลิงก์ Wiki เข้าถึงได้ง่ายขึ้น...
ไม่ว่าในกรณีใด เพื่อตอบคำถามของคุณ:
- ข้อความยาว (มากกว่า 100 บิต) สามารถแมปเป็นข้อความสั้น (100 บิต) ได้อย่างไรโดยฟังก์ชันทางเดียวและเฉพาะข้อความสั้นที่ลงนาม
ไม่ให้เสียงง่ายเกินไป:
สิ่งนี้ไม่เฉพาะเจาะจงสำหรับลายเซ็นที่ใช้แฮช โดยพื้นฐานแล้วอัลกอริธึมลายเซ็นทั้งหมด (อย่างน้อยที่ฉันเคยได้ยิน) ใช้ตัวแปรนี้เป็นขั้นตอนแรก ข้อแตกต่างเพียงอย่างเดียวคือ 100 บิตจะไม่ถือว่ายาวเพียงพอ โดยทั่วไปเรายืนยันในเอาต์พุตแฮชที่นานกว่ามาก (เนื่องจากความสามารถของผู้โจมตีได้เติบโตขึ้นอย่างมากตั้งแต่ปี 1979 ดังนั้นเราจึงจำเป็นต้องทำให้ระบบของเราแข็งแกร่งขึ้น)
คำถามที่ไม่ชัดเจนคือ "ทำไมจึงปลอดภัย" ถ้าเราคิดว่าผู้โจมตีไม่พบข้อความอื่นที่ฟังก์ชันทางเดียวแมปกับ 100 บิตเดียวกัน และผู้โจมตีไม่สามารถสร้างลายเซ็นสำหรับชุด 100 บิตอื่นที่แมปข้อความของผู้โจมตีได้ แสดงว่ามันปลอดภัย .
จริงๆ แล้ว ในทางปฏิบัติ เรากังวลเกี่ยวกับการโจมตีแบบชนกัน ซึ่งผู้โจมตีสามารถควบคุมข้อความที่ถูกต้องที่กำลังเซ็นอยู่ได้ (แต่เขายังต้องสร้างการปลอมแปลง นั่นคือ ลายเซ็นที่ถูกต้องสำหรับข้อความที่ไม่ได้เซ็น) Merkle คำนึงถึงสิ่งนั้น แต่ขอให้ทำสิ่งต่าง ๆ ให้ง่ายสำหรับตอนนี้
- "ข้อความสามารถเข้ารหัสได้ด้วยรหัสสุ่มที่สร้างขึ้นใหม่ ... " ใครช่วยอธิบายเรื่องนี้ให้ฉันฟังหน่อยได้ไหม
ส่วนนี้อาจข้ามไปได้ - นี่คือส่วนหนึ่งของเอกสารที่ crypto สมัยใหม่ไม่ปฏิบัติตาม
Merkle พยายามกำหนด 'ฟังก์ชันการเข้ารหัสที่ผ่านการรับรอง' และใช้สมมติฐานเฉพาะในการทำเช่นนั้น รวมถึงอินพุตแบบสุ่ม ข้อความที่เซ็นชื่อไม่ได้สุ่ม ดังนั้นเขาจึงใส่ฟังก์ชันการเข้ารหัส (ด้วยคีย์สุ่ม) เพื่อให้ตรงกับสมมติฐานของเขา
ใน crypto สมัยใหม่ เราไม่ทำเช่นนี้ - โดยทั่วไปเราใช้ฟังก์ชันแฮชที่มีอยู่ทั่วไป (เช่น SHA-2 หรือ SHAKE) และใช้สิ่งนั้น - สิ่งเหล่านี้ได้รับการออกแบบ (และเข้ารหัส) เพื่อให้ตรงกับสมมติฐานต่างๆ สำหรับการเข้ารหัสลับ ฟังก์ชันแฮช ดังนั้นเราจึง (ในฐานะผู้ออกแบบลายเซ็น) ไม่ต้องกังวลเรื่องนั้น
เพื่อให้ยุติธรรมกับ Merkle นี่อาจเป็นครั้งแรกที่มีคนพยายามค้นหาว่า 'ฟังก์ชันแฮชที่ทนต่อการชนกัน' จะมีหน้าตาเป็นอย่างไร และเขาก็พยายามพอสมควร มันไม่ใช่แนวทางที่นักเข้ารหัสลับใช้ในภายหลัง
- "วิธีการตามที่อธิบายไว้จนถึงตอนนี้ต้องทนทุกข์ทรมานจากข้อบกพร่องที่ B สามารถเปลี่ยน m โดยเปลี่ยนบิตที่เป็น 1 เป็น 0..." ใครช่วยอธิบายวิธีแก้ปัญหานี้ที
ให้เราพิจารณากรณีที่ง่ายที่สุด เซ็นบิตเดียว ใน "วิธีการที่อธิบายไว้จนถึงตอนนี้" ในการสร้างคีย์ส่วนตัว เราจะเลือกค่าแบบสุ่ม $x$และใช้ฟังก์ชันสุ่ม $F$ เพื่อสร้างมูลค่าสาธารณะ $F(x)$. จากนั้น ในการเซ็นชื่อบิต '1' เราจะสร้างเป็นลายเซ็น $x$ (ซึ่งผู้ตรวจสอบจะสามารถตรวจสอบได้ว่า $F$ แม็พนั้นกับคีย์สาธารณะ) อย่างไรก็ตาม ในการเซ็นชื่อบิต '0' เราจะไม่เปิดเผยอะไรเลย เห็นได้ชัดว่าผู้ที่เห็นลายเซ็นที่ถูกต้องของ '1' สามารถแปลงเป็นลายเซ็นของ '0' (หรือสร้างลายเซ็น '0' โดยไม่เห็นอะไรเลยสำหรับเรื่องนั้น)
ในรูปแบบ Lamport ในการเซ็นชื่อบิตเดียว เราสร้างค่าสุ่มสองค่า $x$ และ $x'$และเผยแพร่ค่าเป็นคีย์สาธารณะ $F(x)$ และ $F(x')$. ในการเซ็นชื่อเป็น 0 เราผลิต $x$; เพื่อลงนาม 1 เราผลิต $x'$; ผู้ที่มีลายเซ็น 1 ไม่สามารถสร้างลายเซ็น 0 ได้ (เพราะพวกเขาต้องสร้าง $x$และพวกเขาไม่รู้)
ทีนี้ มันใช้งานได้ แต่มันค่อนข้างแพง (คุณต้องมีคีย์สาธารณะที่มีเอาต์พุตแฮชสองเท่าของจำนวนบิตที่ฟังก์ชันแฮชของคุณสร้างขึ้น ตัวอย่างเช่น ถ้าฟังก์ชันแฮชของคุณให้เอาต์พุต 100 บิต คีย์สาธารณะนี้ประกอบด้วย ของ 200 แฮช) บทความนี้แสดงวิธีลดขนาดตามที่กล่าวไว้ในส่วนที่ 4 และ 5 ของบทความ (ซึ่งเป็นสิ่งที่ใช้ในทางปฏิบัติ)