ไทย

เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · SHA เครื่องคำนวณแฮช

SHA-256 ทีละขั้นตอน: การแพ็ด กำหนดการข้อความ และ 64 รอบ

· มันทำงานอย่างไร

sha-256 การเข้ารหัส เบราว์เซอร์-apis javascript

แผนภาพแสดงการเติมข้อความ การแบ่งบล็อก 64- ลูปการประมวลผลรอบ และการรวมแฮชสุดท้าย
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

SHA-256 เพิ่มอินพุตของคุณ แยกออกเป็นบล็อก 512 บิต และดำเนินการผสมแต่ละรอบ 64 โพสต์นี้จะอธิบายทุกขั้นตอนด้วยภาษาธรรมดาโดยไม่ต้องมีพื้นฐานด้านการเข้ารหัส

เกิดอะไรขึ้นกับไบต์ของคุณ — กล่องดำที่นักพัฒนาส่วนใหญ่ไม่เคยเปิด

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

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

การขยาย — การต่อท้าย 1 bit, ศูนย์ และ 64- ความยาวข้อความเพื่อให้ได้ผลคูณของ 512 bits

ขั้นตอนการเติมถูกกำหนดไว้และเป็นทางการ หลังจากอินพุตจริงของคุณ ให้เพิ่ม 1 bit เดี่ยวต่อท้าย (ในทางปฏิบัติ ไบต์ 0x80 หากอินพุตของคุณสิ้นสุดบนขอบเขตไบต์) จากนั้นต่อท้ายศูนย์บิตจนกว่าคุณจะ 64 bits ขาดจากผลคูณของ 512 bits สุดท้าย ให้เพิ่มการเข้ารหัส big-endian 64 บิตของความยาวอินพุตเป็นบิต การเติมนี้ช่วยให้แน่ใจว่าทุกข้อความเป็นผลคูณของ 512 bits และเข้ารหัสความยาวดั้งเดิม ดังนั้นอินพุตที่เหมือนกันและมีความยาวต่างกันจึงไม่สามารถสร้างข้อมูลย่อยที่เหมือนกันได้

สำหรับอินพุต abc (3 bytes = 24 bits) ข้อความที่มีเบาะคือ 512 bits (หนึ่งบล็อก): สามไบต์ 61 62 63 ตามด้วย 0x80 ตามด้วยศูนย์ ตามด้วยการเข้ารหัส 64 บิตของ 24 (ซึ่งก็คือ 0x00...0x18 ในฟิลด์ big-endian 64 บิต) ขณะนี้ข้อความเติมบล็อก 512 บิตหนึ่งบล็อกเท่านั้น สำหรับสตริงว่าง การเติมจะต่อท้าย 0x80 ตามด้วยศูนย์ ตามด้วย 0x00...0x00 (บ่งชี้ 0 bits ของอินพุต) สำหรับการป้อนข้อมูลที่ยาวกว่า เช่น ไฟล์ 100 ไบต์ การเติมจะเติมบล็อกสุดท้ายเป็น 512 bits และระบุ 800 bits ของความยาวดั้งเดิม

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

อัลกอริทึมเริ่มต้นด้วยตัวแปรการทำงาน 32 บิตแปดตัว โดยเริ่มต้นเป็น 32 bits แรกของเศษส่วนของรากที่สองของจำนวนเฉพาะแปดตัวแรก ค่าเหล่านี้เป็นค่าคงที่แบบฮาร์ดโค้ด ซึ่งมองเห็นได้ในการใช้งานอ้างอิงใดๆ และในซอร์สโค้ดของไลบรารีการเข้ารหัส สิ่งเหล่านี้มีอยู่เพราะการใช้ค่าคงที่คงที่จากคณิตศาสตร์ช่วยหลีกเลี่ยงความสงสัยเกี่ยวกับประตูหลังที่ซ่อนอยู่ เครื่องมือ ToolAcre ใช้งาน Web Crypto ของเบราว์เซอร์ ซึ่งใช้ค่าคงที่เดียวกันนี้

อัลกอริทึมยังใช้ค่าคงที่แบบกลม 64 ซึ่งได้มาจาก 32 bits แรกของเศษส่วนของรากที่สามของจำนวนเฉพาะ 64 ตัวแรก สิ่งเหล่านี้ได้รับการแก้ไขและเป็นสาธารณะด้วย ค่าคงที่ทำหน้าที่เป็นวัสดุผสมเพิ่มเติม การเปลี่ยนแปลงจะทำให้อัลกอริธึมเสียหายและสร้างการแยกย่อยที่แตกต่างกัน

กำหนดการข้อความ — ขยาย 16 คำเป็น 64 ด้วยการเลื่อนและการหมุน

กำหนดการข้อความจะขยาย 16 คำ (512 bits) เป็น 64 คำ (2048 bits) ผ่านสูตรเฉพาะ สำหรับรอบ 0-15 คำจะมาจากบล็อกอินพุตโดยตรง สำหรับรอบ 16-63 แต่ละคำใหม่จะถูกคำนวณโดยการใช้คำสองคำก่อนหน้า (ที่ออฟเซ็ตเฉพาะ) การใช้การหมุนและการเลื่อน การใช้ XOR ในคำอื่น และการจัดเก็บผลลัพธ์ สูตรถูกกำหนดไว้และสามารถย้อนกลับได้ภายในบริบทของบล็อกเดียว แต่ส่วนขยายจะกระจายอิทธิพลของอินพุตไปทั่ว 64 รอบทั้งหมด

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

หนึ่งรอบ — ฟังก์ชัน Ch, Maj และ Sigma อธิบายว่าเป็นการดำเนินการผสมบิต และวิธีที่ตัวแปรการทำงานทั้ง 8 ตัวอัปเดต

แต่ละรอบ 64 จะประมวลผลหนึ่งคำในกำหนดการข้อความและอัปเดตตัวแปรการทำงานทั้งแปดตัว ฟังก์ชันหลักเกี่ยวข้องกับการดำเนินการ 6 รายการ: การผสมตามเงื่อนไข (มักเรียกว่า Ch สำหรับ "เลือก") ที่เลือกบิตตามตัวแปรควบคุม ฟังก์ชันส่วนใหญ่ (Maj) ที่เลือกค่าที่พบบ่อยที่สุดจากสามตัวแปร ฟังก์ชันการผสมพิเศษสองฟังก์ชัน (Sigma_0 และ Sigma_1) ที่หมุนและเปลี่ยนตัวแปรการทำงาน และการบวกโมดูโล 2^32 เลขคณิตทั้งหมดเสร็จสิ้นด้วยคำ 32 บิต ดังนั้นการโอเวอร์โฟลว์จะล้อมรอบ

ฟังก์ชัน "เลือก" รับอินพุต 32 บิตสามอินพุต และสำหรับแต่ละตำแหน่งบิต ให้เลือกบิตจากอินพุตแรกหากบิตควบคุมคือ 1 หรือบิตจากอินพุตที่สองหากบิตควบคุมคือ 0 ฟังก์ชันส่วนใหญ่จะดูที่อินพุตสามตัว และสำหรับแต่ละตำแหน่งบิต จะเอาท์พุตค่าบิตที่ปรากฏบ่อยที่สุดจากทั้งสามอินพุต การดำเนินการเหล่านี้เป็นการดำเนินการที่ไม่เป็นเชิงเส้นซึ่งจะทำลายความเป็นเชิงเส้นและทำให้แน่ใจว่าการเปลี่ยนแปลงอินพุตเล็กๆ น้อยๆ จะแพร่กระจายผ่านสถานะอย่างไม่อาจคาดเดาได้

การต่อบล็อกและการสร้างเอาท์พุต — เพิ่มผลลัพธ์ของแต่ละบล็อกในสถานะกำลังทำงาน

แต่ละรอบจะอัปเดตตัวแปรการทำงานทั้ง 8 ตัวโดยการหมุนตัวแปรเหล่านั้นและรวมค่าใหม่ที่คำนวณจากค่าคงที่ของรอบปัจจุบัน คำกำหนดเวลาข้อความ และสถานะก่อนหน้า ตัวแปรการทำงานเจ็ดตัวแรกจะเปลี่ยน: ตัวที่ 8 จะกลายเป็นตัวที่ 1 ตัวที่ 1 จะกลายเป็นตัวที่ 2 และต่อๆ ไป ตัวที่ 8 ใหม่คำนวณจากตัวแปรเก่าโดยใช้ฟังก์ชันการผสม หลังจาก 64 รอบ คุณจะมีค่า 32-บิตใหม่แปดค่า สิ่งเหล่านี้จะถูกเพิ่ม (modulo 2^32) ให้กับค่าคงที่เริ่มต้น ทำให้เกิดสถานะแฮชสุดท้ายสำหรับบล็อกนี้

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

ตัวอย่างการทำงานและสิ่งนี้ไม่ครอบคลุม - การติดตามการเติมและจำนวนบล็อกสำหรับข้อความสั้น หลักฐานความปลอดภัยอยู่นอกขอบเขต

สำหรับอินพุต abc ข้อความจะพอดีกับบล็อก 512 บิตเดียวหลังการเติม ช่องว่างภายในจะเพิ่ม 424 bits ทำให้ผลรวม 512 bits กำหนดการข้อความขยายเป็น 64 คำ แต่ละรอบใช้หนึ่งคำและอัปเดตตัวแปรการทำงานทั้งแปดผ่านฟังก์ชันการผสม หลังจาก 64 รอบ สถานะจะถูก XORed ด้วยค่าคงที่เริ่มต้น ทำให้เกิดการแยกย่อยสุดท้าย ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

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

Takeaway: Web Crypto ดำเนินการผสม SHA-256 ที่กำหนดโดยไม่เปิดเผยความลับ

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

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