อัลกอริธึมการแฮชข้อมูล ฟังก์ชันแฮชที่เข้ารหัส

ในบทความนี้ฉันจะบอกคุณ แฮชคืออะไรเหตุใดจึงจำเป็น ใช้ที่ไหนและอย่างไร รวมถึงตัวอย่างที่มีชื่อเสียงที่สุด

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

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

บันทึก: วัสดุนี้ได้รับการออกแบบมาสำหรับผู้ใช้ทั่วไปและไม่มีด้านเทคนิคมากนัก แต่ก็มากเกินพอสำหรับการทำความคุ้นเคยขั้นพื้นฐาน

แฮชหรือแฮชคืออะไร?

ฉันจะเริ่มต้นด้วยเงื่อนไข

ฟังก์ชันแฮช, ฟังก์ชัน Convolution- นี่คือฟังก์ชันชนิดพิเศษที่ช่วยให้คุณสามารถแปลงข้อความที่มีความยาวตามต้องการเป็นโค้ดที่มีความยาวคงที่ (โดยปกติจะเป็นสัญลักษณ์ตัวอักษรและตัวเลขแบบสั้น)

การแฮช- นี่คือกระบวนการแปลงข้อความต้นฉบับ

แฮช, รหัสแฮช, ค่าแฮช, ผลรวมแฮชคือค่าเอาท์พุตของฟังก์ชัน Hash กล่าวคือ บล็อกผลลัพธ์จะมีความยาวคงที่

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

นี่คือจุดที่จำเป็นต้องใช้แฮชนี้ ซึ่งเป็นบล็อกสั้นๆ ที่เกิดขึ้นจากข้อความต้นฉบับของไฟล์ ไฟล์ขนาด 10 GB สองไฟล์นี้จะมีรหัสแฮชที่แตกต่างกันแต่สั้นสองรหัส (เช่น "ACCAC43535" และ "BBB3232A42") คุณสามารถค้นหาไฟล์ที่ต้องการได้อย่างรวดเร็วแม้จะคัดลอกและเปลี่ยนชื่อแล้วก็ตาม

บันทึก: เนื่องจากข้อเท็จจริงที่ว่า Hash เป็นแนวคิดที่รู้จักกันดีในโลกคอมพิวเตอร์และบนอินเทอร์เน็ต บ่อยครั้งทุกสิ่งที่เกี่ยวข้องกับ Hash จึงถูกย่อให้เหลือเพียงคำนี้ ตัวอย่างเช่น วลี “ฉันใช้แฮช MD5” เมื่อแปลหมายความว่าเว็บไซต์หรือที่อื่นใช้อัลกอริธึมการแฮชมาตรฐาน MD5

คุณสมบัติของฟังก์ชันแฮช

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

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

และตอนนี้คุณสมบัติของ Hash ก็ทำหน้าที่ของมันเอง:

1. สามารถป้อนข้อความทุกขนาดได้ และเอาต์พุตเป็นบล็อกข้อมูลที่มีความยาวคงที่ สิ่งนี้ตามมาจากคำจำกัดความ

2. ผลรวมแฮชของข้อความเดียวกันจะต้องเท่ากัน มิฉะนั้นฟังก์ชันดังกล่าวจะไม่มีประโยชน์ - คล้ายกับตัวเลขสุ่ม

3. ฟังก์ชันการบิดที่ดีควรมีการกระจายตัวที่ดี ยอมรับว่าหากขนาดของเอาต์พุตแฮชเช่น 16 ไบต์หากฟังก์ชันส่งคืนค่าที่แตกต่างกันเพียง 3 ค่าสำหรับข้อความใด ๆ ฟังก์ชันดังกล่าวและ 16 ไบต์เหล่านี้ก็ไม่มีประโยชน์ (16 ไบต์คือ 2^ 128 ตัวเลือก ซึ่งมีค่าประมาณเท่ากับ 3.4 * 10^38 องศา)

4. ฟังก์ชันตอบสนองต่อการเปลี่ยนแปลงเพียงเล็กน้อยในข้อความต้นฉบับได้ดีเพียงใด ตัวอย่างง่ายๆ เราเปลี่ยน 1 ตัวอักษรในไฟล์ 10 GB ค่าของฟังก์ชันควรแตกต่างออกไป หากไม่เป็นเช่นนั้น การใช้ฟังก์ชันดังกล่าวจะเป็นปัญหาอย่างมาก

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

6. ความเร็วในการคำนวณแฮช การใช้ฟังก์ชัน Convolution คืออะไรหากใช้เวลานานในการคำนวณ? ไม่มี เนื่องจากการเปรียบเทียบข้อมูลไฟล์หรือใช้วิธีการอื่นจะง่ายกว่า

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

8. ซอร์สโค้ดสำหรับฟังก์ชันดังกล่าวเปิดหรือปิด หากไม่ได้เปิดโค้ด ความซับซ้อนของการกู้คืนข้อมูล เช่น ความแรงของการเข้ารหัสก็ยังคงเป็นปัญหาอยู่ ส่วนหนึ่งเป็นปัญหาเกี่ยวกับการเข้ารหัส

ตอนนี้เรามาดูคำถามที่ว่า "ทั้งหมดนี้มีไว้เพื่ออะไร"

ทำไมแฮชจึงจำเป็น?

ฟังก์ชันแฮชมีเป้าหมายหลักเพียงสามประการเท่านั้น (หรือมากกว่านั้นคือวัตถุประสงค์)

1. การตรวจสอบความสมบูรณ์ของข้อมูล ในกรณีนี้ ทุกอย่างง่าย ฟังก์ชันดังกล่าวควรได้รับการคำนวณอย่างรวดเร็วและช่วยให้คุณตรวจสอบได้อย่างรวดเร็วว่า เช่น ไฟล์ที่ดาวน์โหลดจากอินเทอร์เน็ตไม่ได้รับความเสียหายระหว่างการส่ง

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

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

Hash ใช้ที่ไหนและอย่างไร?

ดังที่คุณคงเดาได้อยู่แล้วว่าแฮชถูกใช้เพื่อแก้ไขปัญหาต่างๆ มากมาย นี่คือบางส่วนของพวกเขา:

1. โดยปกติแล้วรหัสผ่านจะไม่ถูกจัดเก็บในรูปแบบข้อความที่ชัดเจน แต่จะอยู่ในรูปแบบของผลรวมแฮช ซึ่งช่วยให้มีระดับความปลอดภัยที่สูงกว่า แม้ว่าผู้โจมตีจะสามารถเข้าถึงฐานข้อมูลดังกล่าวได้ แต่เขาก็ยังต้องใช้เวลาอีกมากในการค้นหาข้อความที่เหมาะสมสำหรับรหัสแฮชเหล่านี้ นี่คือจุดที่คุณลักษณะ “ความยากในการกู้คืนข้อมูลต้นฉบับจากค่าแฮช” เป็นสิ่งสำคัญ

บันทึก: ฉันแนะนำให้คุณอ่านบทความ: เคล็ดลับสองสามข้อในการเพิ่มระดับความปลอดภัยของรหัสผ่าน

2.ในการเขียนโปรแกรมรวมถึงฐานข้อมูล แน่นอนว่าบ่อยครั้งที่เรากำลังพูดถึงโครงสร้างข้อมูลที่ช่วยให้สามารถค้นหาได้อย่างรวดเร็ว ด้านเทคนิคล้วนๆ

3. เมื่อส่งข้อมูลผ่านเครือข่าย (รวมถึงอินเทอร์เน็ต) โปรโตคอลจำนวนมาก เช่น TCP/IP มีช่องตรวจสอบพิเศษที่มีผลรวมแฮชของข้อความต้นฉบับ ดังนั้นหากมีข้อผิดพลาดเกิดขึ้นที่ใดที่หนึ่ง ก็จะไม่ส่งผลกระทบต่อการถ่ายโอนข้อมูล

4. สำหรับอัลกอริธึมที่เกี่ยวข้องกับความปลอดภัยต่างๆ ตัวอย่างเช่น แฮชถูกใช้ในลายเซ็นดิจิทัลแบบอิเล็กทรอนิกส์

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

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

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

ฟังก์ชั่นแฮชที่มีชื่อเสียง

ฟังก์ชันแฮชสามฟังก์ชันต่อไปนี้ถือเป็นฟังก์ชันที่มีชื่อเสียงที่สุด

คำอธิบายประกอบ: การบรรยายนี้กำหนดแนวคิดของฟังก์ชันแฮช และยังให้ภาพรวมโดยย่อของอัลกอริทึมสำหรับการสร้างฟังก์ชันแฮช นอกจากนี้ ยังพิจารณาถึงความเป็นไปได้ในการใช้อัลกอริธึมการเข้ารหัสแบบบล็อกเพื่อสร้างฟังก์ชันแฮชด้วย

วัตถุประสงค์ของการบรรยาย: เพื่อทำความคุ้นเคยกับแนวคิดของฟังก์ชันแฮช รวมถึงหลักการทำงานของฟังก์ชันดังกล่าว

แนวคิดของฟังก์ชันแฮช

ฟังก์ชันแฮชเป็นฟังก์ชันทางคณิตศาสตร์หรือฟังก์ชันอื่นที่คำนวณค่าจำนวนเต็มหรือสตริงอื่นๆ ที่มีความยาวคงที่สำหรับสตริงที่มีความยาวตามใจชอบ ในทางคณิตศาสตร์สามารถเขียนได้ดังนี้:

โดยที่ M คือข้อความต้นฉบับ บางครั้งเรียกว่า ต้นแบบและ h คือผลลัพธ์ที่เรียกว่าค่าแฮช (และด้วย รหัสแฮชหรือ สรุปข้อความ(จากภาษาอังกฤษ สรุปข้อความ)).

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

ฟังก์ชันแฮชใช้กันอย่างแพร่หลายในวิทยาการเข้ารหัสลับสมัยใหม่

ฟังก์ชันแฮชที่ง่ายที่สุดสามารถสร้างขึ้นได้โดยใช้การดำเนินการ "sum modulo 2" ดังต่อไปนี้: เราได้รับสตริงอินพุต เพิ่มไบต์โมดูโล 2 ทั้งหมด แล้วส่งคืนไบต์ผลลัพธ์เป็นค่าแฮช ความยาวของค่าฟังก์ชันแฮชในกรณีนี้คือ 8 บิต โดยไม่คำนึงถึงขนาดของข้อความอินพุต

ตัวอย่างเช่น สมมติว่าข้อความต้นฉบับที่แปลเป็นรูปแบบดิจิทัลมีดังต่อไปนี้ (เป็นเลขฐานสิบหก):

มาแปลงข้อความเป็นรูปแบบไบนารี เขียนไบต์หนึ่งไว้ด้านล่างอีกไบต์ และเพิ่มบิตลงในแต่ละคอลัมน์โมดูโล 2:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

ผลลัพธ์ (0110 0101 (2) หรือ 65 (16)) จะเป็นค่าแฮช

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

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

ให้เรากำหนดข้อกำหนดพื้นฐานสำหรับฟังก์ชันแฮชที่เข้ารหัส:

  • ฟังก์ชันแฮชจะต้องใช้ได้กับข้อความทุกขนาด
  • การคำนวณค่าฟังก์ชันควรดำเนินการอย่างรวดเร็วเพียงพอ
  • เมื่อพิจารณาค่าฟังก์ชันแฮชที่ทราบแล้ว จึงน่าจะเป็นเรื่องยาก (แทบจะเป็นไปไม่ได้เลย) ในการค้นหาอิมเมจผกผันที่เหมาะสมของ M
  • เมื่อได้รับข้อความ M ที่รู้จัก ควรจะเป็นเรื่องยากที่จะค้นหาข้อความ M' ​​อื่นที่มีค่าแฮชเดียวกันกับข้อความต้นฉบับ
  • การค้นหาคู่ข้อความที่แตกต่างกันแบบสุ่มที่มีค่าแฮชเดียวกันน่าจะเป็นเรื่องยาก

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

ในทางปฏิบัติในปัจจุบัน ฟังก์ชันที่ประมวลผลบล็อกข้อความอินพุตทีละบล็อกและคำนวณค่าแฮช h i สำหรับแต่ละบล็อก M i ของข้อความอินพุตตามการขึ้นต่อกันของแบบฟอร์มจะถูกใช้เป็นฟังก์ชันแฮช

ชั่วโมง ผม =H(ม ผม ,ชั่วโมง ผม-1),

โดยที่ h i-1 เป็นผลลัพธ์ที่ได้รับเมื่อคำนวณฟังก์ชันแฮชสำหรับบล็อกข้อมูลอินพุตก่อนหน้า

ผลลัพธ์ของฟังก์ชันแฮช h n จึงเป็นฟังก์ชันของ n บล็อกทั้งหมดของข้อความอินพุต

การใช้อัลกอริธึมการเข้ารหัสบล็อกเพื่อสร้างฟังก์ชันแฮช

คุณสามารถใช้ฟังก์ชันแฮชแบบบล็อกเป็นฟังก์ชันแฮชได้ หากอัลกอริธึมบล็อกที่ใช้มีการเข้ารหัสที่แข็งแกร่ง ฟังก์ชันแฮชที่ใช้อัลกอริทึมนั้นก็จะปลอดภัย

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

  • แทบจะเป็นไปไม่ได้เลยที่จะคำนวณค่าแฮชสำหรับอาเรย์ข้อมูลแบบเปิดที่กำหนดโดยไม่ทราบคีย์เข้ารหัส
  • หากไม่ทราบคีย์เข้ารหัส แทบจะเป็นไปไม่ได้เลยที่จะเลือกข้อมูลที่เปิดสำหรับค่าฟังก์ชันแฮชที่กำหนด

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

กระบวนการรับและการใช้เม็ดมีดเลียนแบบที่ระบุได้อธิบายไว้ในมาตรฐานในประเทศ GOST 28147-89 มาตรฐานเสนอให้ใช้บล็อก 32 บิตที่ต่ำกว่าที่ได้รับจากเอาต์พุตของการดำเนินการเข้ารหัสข้อความทั้งหมดในโหมดการผูกมัดบล็อกการเข้ารหัสเพื่อควบคุมความสมบูรณ์ของข้อความที่ส่ง ในทำนองเดียวกัน คุณสามารถใช้บล็อกบล็อกใดก็ได้เพื่อสร้างส่วนแทรกจำลอง อัลกอริธึมการเข้ารหัสแบบสมมาตร.

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

จริงๆ แล้ว ยังมีอีกหลายวิธีที่เป็นไปได้สำหรับการใช้บล็อคไซเฟอร์เพื่อสร้างฟังก์ชันแฮช ให้ M i เป็นบล็อกของข้อความต้นฉบับ h i เป็นค่าของฟังก์ชันแฮชที่ระยะที่ i, f เป็นอัลกอริธึมการเข้ารหัสบล็อกที่ใช้ในโหมดการแทนที่อย่างง่าย และให้ เป็นการดำเนินการของการบวกโมดูโล 2 จากนั้น ตัวอย่างเช่น รูปแบบต่อไปนี้สำหรับการสร้างฟังก์ชันแฮชเป็นไปได้:

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

ข้อเสียเปรียบหลักของฟังก์ชันแฮชที่ออกแบบตามอัลกอริธึมบล็อกคือความเร็วการทำงานค่อนข้างต่ำ ความแข็งแกร่งของการเข้ารหัสลับที่ต้องการสามารถทำได้โดยมีการดำเนินการกับข้อมูลอินพุตน้อยลง มีอัลกอริธึมการแฮชที่เร็วกว่าซึ่งออกแบบโดยอิสระตั้งแต่เริ่มต้นโดยอิงตามข้อกำหนดด้านความแข็งแกร่งของการเข้ารหัส (โดยทั่วไปคือ MD5, SHA-1, SHA-2 และ GOST R 34.11-94)

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

แนวคิดพื้นฐาน

ตารางแฮช

ตารางแฮชเป็นอาร์เรย์ปกติที่มีการกำหนดที่อยู่พิเศษที่ระบุโดยฟังก์ชันบางอย่าง (ฟังก์ชันแฮช)

ฟังก์ชันแฮช

ฟังก์ชันที่จับคู่คีย์ของรายการข้อมูลกับดัชนีบางส่วนในตาราง ( ตารางแฮช), เรียกว่า ฟังก์ชั่นการแฮช หรือ ฟังก์ชันแฮช :

ฉัน = ชม. (สำคัญ );

ที่ไหน สำคัญ- กุญแจเปิดประทุน, ฉัน- ดัชนีตารางผลลัพธ์เช่น คีย์จะแสดงเป็นชุด เช่น จำนวนเต็ม ( ที่อยู่แฮช ) ซึ่งจะถูกนำไปใช้ในการเข้าถึงข้อมูลในภายหลัง

การแฮชในลักษณะนี้เป็นเทคนิคที่เกี่ยวข้องกับการใช้ค่าของคีย์เพื่อกำหนดตำแหน่งในตารางพิเศษ

อย่างไรก็ตามฟังก์ชันการจัดเรียงสามารถทำได้ หลาย ค่าคีย์ที่ไม่ซ้ำให้ค่าตำแหน่งเดียวกัน ฉัน ในตารางแฮช สถานการณ์ที่คีย์ตั้งแต่สองคีย์ขึ้นไปใช้ดัชนีเดียวกัน (ที่อยู่แฮช) เรียกว่า การชนกัน (ขัดแย้งกัน) เมื่อทำการแฮช ดังนั้น รูปแบบการแฮชจึงต้องประกอบด้วย อัลกอริธึมการแก้ไขข้อขัดแย้ง ซึ่งกำหนดลำดับของการกระทำหากตำแหน่ง ฉัน=ชม.(สำคัญ) ปรากฏว่าถูกครอบครองโดยบันทึกที่มีคีย์อื่น

มีรูปแบบการแฮชมากมาย ขึ้นอยู่กับฟังก์ชันแฮชที่ใช้ ชม.(สำคัญ) และอัลกอริธึมการแก้ไขข้อขัดแย้ง

วิธีการทั่วไปในการระบุฟังก์ชันแฮชคือ: วิธีการหาร

ข้อมูลเริ่มต้นคือ: - คีย์จำนวนเต็มบางตัว สำคัญและขนาดโต๊ะ - ผลลัพธ์ของฟังก์ชันนี้คือส่วนที่เหลือเมื่อแบ่งคีย์นี้ตามขนาดของตาราง มุมมองทั่วไปของฟังก์ชันดังกล่าวในภาษาการเขียนโปรแกรม C/C++ คือ:

ภายใน ชม. (ภายใน สำคัญ , ภายใน ) {

สำหรับ ฟังก์ชันแฮช = 10 ส่งคืนตัวเลขที่มีนัยสำคัญน้อยที่สุดของคีย์

สำหรับ m= 100 ฟังก์ชันแฮชจะส่งคืนตัวเลขที่มีนัยสำคัญน้อยที่สุดสองหลักของคีย์

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

แบบแผนแฮช

ในปัญหาส่วนใหญ่ คีย์ตั้งแต่ 2 คีย์ขึ้นไปมีแฮชเหมือนกัน แต่คีย์เหล่านั้นไม่สามารถครอบครองเซลล์เดียวกันในตารางแฮชได้ มีสองตัวเลือกที่เป็นไปได้: ค้นหาตำแหน่งอื่นสำหรับคีย์ใหม่ หรือสร้างรายการแยกต่างหากสำหรับดัชนีตารางแฮชแต่ละรายการที่มีคีย์ทั้งหมดที่แมปกับดัชนีนั้น

ตัวเลือกเหล่านี้แสดงถึงรูปแบบการแฮชแบบคลาสสิกสองแบบ:

    การแฮชโดยใช้วิธีการเปิดที่อยู่ด้วยการสุ่มตัวอย่างเชิงเส้น - เชิงเส้น สอบสวน เปิด ที่อยู่.

    การแฮชโดยใช้วิธีลูกโซ่ (พร้อมรายการ) หรือที่เรียกว่าการแฮชหลายมิติ - การผูกมัด กับ แยก รายการ;

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

เหล่านั้น. องค์ประกอบที่มีคีย์ที่เป็นเนื้อเดียวกันจะถูกวางไว้ใกล้กับดัชนีผลลัพธ์

ในอนาคตเมื่อทำการค้นหาให้ค้นหาตำแหน่งด้วยปุ่มก่อน ฉันในตารางและหากคีย์ไม่ตรงกัน การค้นหาครั้งต่อไปจะดำเนินการตามอัลกอริธึมการแก้ไขข้อขัดแย้ง โดยเริ่มจากตำแหน่ง ฉัน. .

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

เป็นผลให้เรามีตารางอาร์เรย์ของรายการหรือแผนผังที่เชื่อมโยง

กระบวนการเติม (อ่าน) ตารางแฮชนั้นง่ายดาย แต่การเข้าถึงองค์ประกอบจำเป็นต้องมีการดำเนินการต่อไปนี้:

การคำนวณดัชนี ฉัน;

ค้นหาในเธรดที่เกี่ยวข้อง

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

ตัวอย่างการใช้งานวิธีการระบุที่อยู่โดยตรงด้วยการสุ่มตัวอย่างเชิงเส้น - แหล่งข้อมูลมี 7 บันทึก (เพื่อความง่าย ส่วนข้อมูลประกอบด้วยข้อมูลจำนวนเต็มเท่านั้น) ประเภทโครงสร้างที่ประกาศ:

คีย์ int; // สำคัญ

ข้อมูลอินท์; // ข้อมูล

(59.1), (70.3), (96.5), (81.7), (13.8), (41.2), (79.9); ขนาดตารางแฮช m=10

ฟังก์ชันแฮช ฉัน=ชม.(ข้อมูล) =ข้อมูล.สำคัญ%10; เหล่านั้น. เศษที่เหลือหารด้วย 10 - ฉัน.

จากข้อมูลเบื้องต้น เราจะกรอกข้อมูลลงในตารางแฮชตามลำดับ

การแฮชคีย์ห้าคีย์แรกจะให้ดัชนีที่แตกต่างกัน (ที่อยู่แฮช):

การชนกันครั้งแรกเกิดขึ้นระหว่างคีย์ 81 และ 41 - สถานที่ที่มีดัชนี 1 ถูกครอบครอง ดังนั้นเราจึงดูตารางแฮชเพื่อค้นหาพื้นที่ว่างที่ใกล้ที่สุด ในกรณีนี้คือ ฉัน = 2.

คีย์ถัดไป 79 ยังทำให้เกิดการชนกัน: ตำแหน่ง 9 ถูกครอบครองแล้ว ประสิทธิภาพของอัลกอริธึมลดลงอย่างรวดเร็วเพราะว่า ต้องใช้ 6 ตัวอย่าง (เปรียบเทียบ) เพื่อค้นหาพื้นที่ว่าง ดัชนีปรากฏว่าว่าง ฉัน= 4.

จำนวนตัวอย่างทั้งหมดของวิธีนี้คือตั้งแต่ 1 ถึง n-1 ตัวอย่างต่อองค์ประกอบ โดยที่ n คือขนาดของตารางแฮช

การนำวิธีลูกโซ่ไปใช้ สำหรับตัวอย่างก่อนหน้านี้ เราประกาศประเภทที่มีโครงสร้างสำหรับองค์ประกอบรายการ (ทิศทางเดียว):

คีย์ int; // สำคัญ

ข้อมูลอินท์; // ข้อมูล

zap*ถัดไป; // ชี้ไปยังองค์ประกอบถัดไปในรายการ

จากข้อมูลเริ่มต้น เราจะเติมตารางแฮชตามลำดับ โดยเพิ่มองค์ประกอบใหม่ที่ส่วนท้ายของรายการหากสถานที่นั้นถูกครอบครองแล้ว

การแฮชคีย์ห้าคีย์แรกเหมือนกับในกรณีก่อนหน้า จะให้ดัชนีที่แตกต่างกัน (ที่อยู่แฮช): 9, 0, 6, 1 และ 3

เมื่อเกิดการชนกัน องค์ประกอบใหม่จะถูกเพิ่มที่ส่วนท้ายของรายการ ดังนั้น องค์ประกอบที่มีคีย์ 41 จะถูกวางไว้หลังองค์ประกอบที่มีคีย์ 81 และองค์ประกอบที่มีคีย์ 79 จะถูกวางไว้หลังองค์ประกอบที่มีคีย์ 59

งานส่วนบุคคล

1. ต้นไม้ไบนารีใช้โปรแกรมเซ็นเซอร์ตัวเลขสุ่มรับ 10 ค่าตั้งแต่ 1 ถึง 99 และสร้างแผนผังไบนารี

ทำการอ้อม:

1.a การข้ามจากซ้ายไปขวา: ซ้าย-รูท-ขวา: ก่อนอื่นเราจะไปที่ทรีย่อยด้านซ้าย จากนั้นไปที่รูท และสุดท้ายคือทรีย่อยทางขวา

(หรือในทางกลับกันจากขวาไปซ้าย: ขวา - รูท - ซ้าย)

1.b การเคลื่อนที่จากบนลงล่าง: ราก-ซ้าย-ขวา: เราไปที่รากไปยังทรีย่อย

1.c Traversal จากล่างขึ้นบน: ซ้าย-ขวา-รูท: ไปที่รูทหลังทรีย่อย

การแฮช(บางครั้งการแฮช, การแฮชภาษาอังกฤษ) - การแปลงอาร์เรย์ข้อมูลอินพุตที่มีความยาวตามอำเภอใจให้เป็นสตริงเอาต์พุตที่มีความยาวคงที่ การเปลี่ยนแปลงดังกล่าวเรียกอีกอย่างว่า ฟังก์ชันแฮชหรือ ฟังก์ชันการบิด, อาร์เรย์อินพุต – ต้นแบบและผลลัพธ์ของการแปลงก็คือ แฮช, รหัสแฮช, รูปภาพแฮช, ลายนิ้วมือดิจิตอลหรือ สรุปข้อความ(สรุปข้อความภาษาอังกฤษ)

ฟังก์ชันแฮช– ฟังก์ชั่นที่คำนวณได้ง่ายซึ่งแปลงข้อความเริ่มต้นที่มีความยาวตามต้องการ (ภาพก่อนหน้า) ให้เป็นข้อความที่มีความยาวคงที่ (ภาพแฮช) ซึ่งไม่มีอัลกอริธึมการค้นหาการชนกันที่มีประสิทธิภาพ

การชนกันสำหรับฟังก์ชั่น ชม.เรียกว่าคู่คุณค่า x, y, x ≠ yเช่นนั้น ชั่วโมง(x) = ชั่วโมง(y)- ที่. ฟังก์ชันแฮชต้องมีคุณสมบัติดังต่อไปนี้:

สำหรับค่าที่กำหนด ชั่วโมง(x)ไม่สามารถหาค่าอาร์กิวเมนต์ได้ x- ฟังก์ชันแฮชดังกล่าวเรียกว่า ต่อเนื่องในแง่ของการรักษาหรือ ยืนหยัดในความหมายที่แข็งแกร่ง;

สำหรับการโต้แย้งที่กำหนด xไม่พบข้อโต้แย้งอื่น เช่นนั้น ชั่วโมง(x) = ชั่วโมง(y)- ฟังก์ชันแฮชดังกล่าวเรียกว่า แข็งแกร่งในแง่ของการคำนวณการชนกันหรือ ยืนหยัดในความหมายที่อ่อนแอ.

ในกรณีที่ค่าฟังก์ชันแฮชไม่เพียงขึ้นอยู่กับพรีอิมเมจเท่านั้น แต่ยังขึ้นอยู่กับคีย์ส่วนตัวด้วย ค่านี้เรียกว่า Message Authentication Code (MAC), Data Authentication Code (DAC) หรือ การแทรกเลียนแบบ.

ในทางปฏิบัติ ฟังก์ชันแฮชถูกใช้เพื่อวัตถุประสงค์ดังต่อไปนี้:

เพื่อเพิ่มความเร็วในการค้นหาข้อมูลในฐานข้อมูล

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

อะนาล็อกในครัวเรือนของการแฮชในกรณีนี้สามารถวางคำในพจนานุกรมตามลำดับตัวอักษร ตัวอักษรตัวแรกของคำคือรหัสแฮช และเมื่อค้นหา เราไม่ได้ดูพจนานุกรมทั้งหมด แต่จะดูเฉพาะส่วนที่มีตัวอักษรที่ต้องการเท่านั้น

ขั้นตอนการคำนวณ (แผนภาพอัลกอริทึมมาตรฐาน) ของฟังก์ชันแฮชแสดงไว้ในรูปต่อไปนี้

มะเดื่อ 10.1. ขั้นตอนการคำนวณค่าแฮช

1) ไปยังข้อความต้นฉบับ มีการเพิ่มข้อมูลเสริม (เช่น ความยาวของพรีอิมเมจ สัญลักษณ์เสริม ฯลฯ) เพื่อให้ความยาวของพรีอิมเมจ เอ็กซ์กลายเป็นผลคูณของ ปอนด์กำหนดโดยข้อกำหนดฟังก์ชันแฮช (มาตรฐาน)

2) ในการเริ่มต้นขั้นตอนการแฮช จะมีการใช้ข้อความการซิงโครไนซ์ ใช่ 0.

3) ต้นแบบ เอ็กซ์แตกออกเป็น nบล็อก x ฉัน(i = 1 .. n) ความยาวคงที่ ปอนด์ซึ่งใช้ขั้นตอนการแฮชประเภทเดียวกัน ฉ(ฉัน ฉัน-1 , x ฉัน)ขึ้นอยู่กับผลการแฮชของบล็อกก่อนหน้า ใช่ ฉัน-1.

4) วิธีแฮช ชั่วโมง(T)ข้อความต้นฉบับ จะเป็นผลจากขั้นตอนการแฮช ใช่ได้รับหลังจากประมวลผลบล็อกสุดท้าย เอ็กซ์เอ็น.

10.2. เอ็มดี5

เอ็มดี5 Message Digest 5 เป็นอัลกอริธึมการแฮช 128 บิตที่พัฒนาโดยศาสตราจารย์ Ronald L. Rivest แห่งสถาบันเทคโนโลยีแมสซาชูเซตส์ (MIT) ในปี 1991 เป็น MD4 เวอร์ชันที่ได้รับการปรับปรุงความปลอดภัย

ด้านล่างนี้คืออัลกอริธึมการคำนวณแฮช

1. การปรับสมดุลการไหล

ในตอนท้ายของข้อความต้นฉบับความยาว เพิ่มหนึ่งบิตแล้วจำนวนศูนย์บิตที่ต้องการเพื่อให้ขนาดใหม่ แอล"เทียบได้กับ 448 โมดูโล 512 (L 'mod 512 = 448) การเพิ่มศูนย์บิตจะดำเนินการแม้ว่าความยาวใหม่ซึ่งรวมถึงหนึ่งบิตนั้นสามารถเทียบเคียงได้กับ 448 แล้ว

2. การเพิ่มความยาวของข้อความ

การแสดงความยาวข้อมูลแบบ 64 บิต (จำนวนบิตในข้อความ) จะถูกผนวกเข้ากับข้อความที่แก้ไข เหล่านั้น. ความยาวข้อความ กลายเป็นผลคูณของ 512 (T mod 512 = 0) หากความยาวของข้อความต้นฉบับเกิน 2 64 - 1 ระบบจะเพิ่มเฉพาะ 64 บิตที่ต่ำกว่าเท่านั้น นอกจากนี้ สำหรับการแสดงความยาว 64 บิตที่ระบุ 32 บิตที่มีลำดับต่ำจะถูกเขียนก่อน ตามด้วย 32 บิตที่มีลำดับสูง

3. การเริ่มต้นบัฟเฟอร์

สำหรับการคำนวณ ตัวแปร 4 ตัว ตัวละ 32 บิตจะถูกเตรียมใช้งานและตั้งค่าเริ่มต้น (การแสดงเลขฐานสิบหก):

= 67 45 23 01;
บี= EF ซีดี AB 89;
= 98 บริติชแอร์เวย์ กระแสตรง FE;
ดี = 10 32 54 76.

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

4. การคำนวณแฮชแบบวนซ้ำ

ข้อความต้นฉบับแบ่งออกเป็นบล็อก ยาว 512 บิต สำหรับแต่ละบล็อกในรอบ จะดำเนินการตามขั้นตอนที่แสดงในรูปที่ 10.2 ผลลัพธ์ของการประมวลผลบล็อกทั้งหมดของข้อความต้นฉบับเป็นการรวมค่าตัวแปร 32 บิต เอบีซีดีและจะเป็นแฮช

มะเดื่อ 10.2. ขั้นตอนการคำนวณแฮชหลัก

ในแต่ละรอบจะมีตัวแปรมากกว่า เอบีซีดีและบล็อกข้อความต้นฉบับ ในรอบ (การวนซ้ำ 16 ครั้ง) การแปลงที่คล้ายกันจะดำเนินการตามรูปแบบต่อไปนี้

มะเดื่อ 10.3. การวนซ้ำหนึ่งรอบ

อนุสัญญา

1) รฟ- ฟังก์ชันแบบกลม กำหนดตามตารางต่อไปนี้

ตารางที่ 10.1. ฟังก์ชัน RF แบบกลม

2) ทีเจ- ส่วน j-th 32 บิตของบล็อกข้อความต้นฉบับ บิ๊กเอนเดียน;

3) โอเค- ส่วนจำนวนเต็มของค่าคงที่ที่กำหนดโดยสูตร

กี่ = 2 32 * | บาป(i + 16 * (r - 1)) |, (10.1)

โดยที่ i คือหมายเลขการวนซ้ำ (i = 1..16)
r – ตัวเลขกลม (r = 1..4)

อาร์กิวเมนต์ของฟังก์ชัน sin วัดเป็นเรเดียน

4) ⊞ – นอกจากนี้โมดูโล 2 32

5) <<< ฉัน– วงจรเลื่อนไปทางซ้ายด้วยตัวเลข s i

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

ตารางที่ 10.2. ปริมาณที่ใช้ในขั้นตอนรอบรอบ

หมายเลขการวนซ้ำ1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
รอบที่ 1ทีเจเสื้อ 1เสื้อ 2เสื้อ 3เสื้อ 4เสื้อ 5เสื้อ 6เสื้อ 7เสื้อ 8ที 9เสื้อ 10เสื้อ 11เสื้อ 12เสื้อ 13เสื้อ 14เสื้อ 15เสื้อ 16
ฉัน7 12 17 22 7 12 17 22 7 12 17 22 7 12 17 22
รอบ 2ทีเจเสื้อ 2เสื้อ 7เสื้อ 12เสื้อ 1เสื้อ 6เสื้อ 11เสื้อ 16เสื้อ 5เสื้อ 10เสื้อ 15เสื้อ 4ที 9เสื้อ 14เสื้อ 3เสื้อ 8เสื้อ 13
ฉัน5 9 14 20 5 9 14 20 5 9 14 20 5 9 14 20
รอบ 3ทีเจเสื้อ 6ที 9เสื้อ 12เสื้อ 15เสื้อ 2เสื้อ 5เสื้อ 8เสื้อ 11เสื้อ 14เสื้อ 1เสื้อ 4เสื้อ 7เสื้อ 10เสื้อ 13เสื้อ 16เสื้อ 3
ฉัน4 11 16 23 4 11 16 23 4 11 16 23 4 11 16 23
รอบที่ 4ทีเจเสื้อ 1เสื้อ 8เสื้อ 15เสื้อ 6เสื้อ 13เสื้อ 4เสื้อ 11เสื้อ 2ที 9เสื้อ 16เสื้อ 7เสื้อ 14เสื้อ 5เสื้อ 12เสื้อ 3เสื้อ 10
ฉัน6 10 15 21 6 10 15 21 6 10 15 21 6 10 15 21

หลังจากครบ 4 รอบ ค่าใหม่ (แก้ไข) สำหรับแต่ละตัวแปร เอบีซีดีเพิ่ม (⊞) ให้กับต้นฉบับ (ค่าของตัวแปรก่อนรอบที่ 1)

5. การจัดเรียงไบต์ใหม่ในตัวแปร ABCD- หลังจากประมวลผลบล็อคทั้งหมดของข้อความต้นฉบับแล้ว จะมีการดำเนินการสลับไบต์แบบย้อนกลับสำหรับแต่ละตัวแปร

ค้นหาการชนกัน

ในปี 2004 นักวิจัยชาวจีน Wang Xiaoyun, Feng Dengguo, Lai Xuejia และ Yu Hongbo ประกาศว่าพวกเขาได้ค้นพบช่องโหว่ในอัลกอริทึมที่อนุญาตให้ IBM p690) ค้นหาการชนกัน

10.3. การใช้การเข้ารหัสเพื่อรับอิมเมจแฮช

ในการสร้างอิมเมจแฮชที่ป้องกันการชนกัน สามารถใช้โหมดพิเศษที่มีให้ในบล็อกไซเฟอร์ (เช่น การต่อบล็อกไซเฟอร์ y) ไว้ได้ หรือในฟังก์ชันแฮชนั้นเอง สามารถใช้โหมดการเข้ารหัสบล็อกโหมดใดโหมดหนึ่งเป็นส่วนประกอบได้ ( ตัวอย่างเช่นแฮชของส่วนประกอบ -ฟังก์ชันตาม GOST 34.11-94 1 เป็นโหมดของการแทนที่อัลกอริธึมการแปลงการเข้ารหัสลับอย่างง่าย ๆ ตาม 2)

ขอให้เราระลึกว่าในกรณีที่ค่าฟังก์ชันแฮชไม่ได้ขึ้นอยู่กับต้นแบบเท่านั้น แต่ยังขึ้นอยู่กับคีย์ส่วนตัวด้วย ภาพแฮชจะเรียกว่า Message Authentication Code (MAC), Data Authentication Code (DAC) หรือ การแทรกเลียนแบบ.

ตัวอย่างเช่น เราจะให้โหมด (การผูกมัดบล็อกการเข้ารหัส)

มะเดื่อ 10.4. โครงร่างของอัลกอริทึม DES ในโหมดการผูกมัดบล็อกการเข้ารหัส

บล็อกที่เข้ารหัสล่าสุด ซีเอ็นและมีภาพแฮชของข้อความ T = (T 1, T 2, …, T n).

1 GOST 34.11-94 “เทคโนโลยีสารสนเทศ การปกป้องข้อมูลการเข้ารหัส ฟังก์ชั่นแฮช”

2 GOST 28147-89 “ระบบประมวลผลข้อมูล การป้องกันการเข้ารหัส อัลกอริธึมการแปลงการเข้ารหัส”

คำถามทดสอบตัวเอง

1. กำหนดแนวคิด: "", "", ""

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

แนวคิด คร่ำครวญ– นี่คือการแบ่งพาร์ติชันของชุดคีย์เฉพาะขององค์ประกอบข้อมูลทั่วไป (ฐาน) ให้เป็นชุดที่ไม่เป็นสมาชิกร่วมด้วยคุณสมบัติบางอย่าง

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

ในความเป็นจริง การแฮชเป็นวิธีการพิเศษในการจัดการกับข้อมูลเพื่อค้นหาข้อมูลที่จำเป็นอย่างรวดเร็ว โดยกุญแจ .

หากชุดพื้นฐานประกอบด้วย เอ็นองค์ประกอบแล้วจึงแบ่งได้เป็น 2 เอ็นชุดย่อยต่างๆ

ตารางแฮชและฟังก์ชันแฮช

ฟังก์ชันที่จับคู่คีย์ของรายการข้อมูลกับชุดจำนวนเต็ม (ดัชนีในตาราง - ตารางแฮช ), เรียกว่า ฟังก์ชั่นการแฮช , หรือ ฟังก์ชันแฮช :

ฉัน = ชม.(สำคัญ);

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

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

ฟังก์ชันแฮชที่ดีคือฟังก์ชันที่ลดการชนกันและกระจายข้อมูลเท่าๆ กันทั่วทั้งตาราง และฟังก์ชันแฮชที่สมบูรณ์แบบคือฟังก์ชันที่ไม่ทำให้เกิดการชนกัน:

มีสองวิธีในการแก้ไขการชนกันของแฮช:

– วิธีการระบุที่อยู่แบบเปิดพร้อมการทดสอบเชิงเส้น

– วิธีลูกโซ่

ตารางแฮช

ตารางแฮชคืออาร์เรย์ปกติซึ่งมีที่อยู่ที่ผิดปกติซึ่งระบุโดยฟังก์ชันแฮช

โครงสร้างแฮชถือเป็นลักษณะทั่วไปของอาร์เรย์ที่ให้การเข้าถึงข้อมูลโดยตรงอย่างรวดเร็วตามดัชนี

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

ตัวอย่างของฟังก์ชันแฮช

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

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

int h(คีย์ int, int m) (

ส่งคืนคีย์ % m; // ค่า

สำหรับ ฟังก์ชันแฮช = 10 ส่งคืนตัวเลขที่มีนัยสำคัญน้อยที่สุดของคีย์

สำหรับ ฟังก์ชันแฮช = 100 ส่งคืนคีย์ที่มีนัยสำคัญน้อยที่สุดสองหลัก

วิธีการเติมแต่งโดยที่คีย์คือสตริงอักขระ ในฟังก์ชันแฮช สตริงจะถูกแปลงเป็นจำนวนเต็มโดยการรวมอักขระทั้งหมดและส่งกลับส่วนที่เหลือหลังจากหารด้วย (ปกติจะเป็นขนาดโต๊ะ. = 256).

int h(ถ่าน *คีย์, int m) (

การชนกันเกิดขึ้นในสตริงที่ประกอบด้วยชุดอักขระเดียวกัน เช่น เอบีซีและ รถแท็กซี่.

วิธีนี้สามารถปรับเปลี่ยนได้เล็กน้อย โดยได้ผลลัพธ์โดยการรวมเฉพาะอักขระตัวแรกและตัวสุดท้ายของสตริงคีย์

int h(ถ่าน *คีย์, int m) (

int len ​​= strlen (คีย์), s = 0;

ถ้า(len< 2) // Если длина ключа равна 0 или 1,

s = คีย์; //คืนกุญแจ

s = คีย์ + คีย์;

ในกรณีนี้ การชนกันจะเกิดขึ้นเฉพาะในเส้นเท่านั้น เช่น เอบีซีและ บบส.

วิธีกลางกำลังสองซึ่งคีย์จะถูกยกกำลังสอง (คูณด้วยตัวมันเอง) และตัวเลขกลางหลายตัวของค่าผลลัพธ์จะถูกนำมาใช้เป็นดัชนี

ตัวอย่างเช่น คีย์เป็นจำนวนเต็ม 32 บิต และฟังก์ชันแฮชส่งคืนค่าเฉลี่ย 10 บิตของกำลังสอง:

int h (คีย์ int) (

คีย์ >>= 11; // ทิ้งบิตที่มีนัยสำคัญน้อยที่สุด 11 บิต

ส่งคืนคีย์ % 1024; // ส่งกลับบิตที่มีนัยสำคัญน้อยที่สุด 10 บิต

วิธีพิเศษหรือสำหรับคีย์แถว (โดยปกติจะเป็นขนาดตาราง =256) วิธีนี้คล้ายกับวิธีการบวก แต่จะแยกแยะคำที่คล้ายคลึงกัน วิธีการคือการดำเนินการ "พิเศษหรือ" จะถูกนำไปใช้กับองค์ประกอบของสตริงตามลำดับ

ใน วิธีการคูณ นอกจากนี้ยังใช้จำนวนจริงสุ่มอีกด้วย จากช่วงเวลา หากคูณผลิตภัณฑ์นี้ด้วยขนาดของตาราง จากนั้นส่วนจำนวนเต็มของผลิตภัณฑ์ผลลัพธ์จะให้ค่าในช่วงตั้งแต่ 0 ถึง –1.

int h(คีย์ int, int m) (

สองครั้ง r = คีย์ * rnd();

r = r – (int)r; // เลือกส่วนที่เป็นเศษส่วน

โดยทั่วไปแล้วสำหรับค่าที่มาก ดัชนีที่สร้างโดยฟังก์ชันแฮชนั้นมีสเปรดที่กว้าง นอกจากนี้ ทฤษฎีทางคณิตศาสตร์ยังระบุว่าการกระจายตัวมีความสม่ำเสมอมากกว่าหาก เป็นจำนวนเฉพาะ

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



มีคำถามอะไรไหม?

แจ้งการพิมพ์ผิด

ข้อความที่จะส่งถึงบรรณาธิการของเรา: