อาจปรากฏในบริบทเดียวกัน แต่มีความแตกต่างกันอย่างมาก
การเข้ารหัสเป็นเรื่องเกี่ยวกับการรักษาความลับและสามารถกู้คืนได้ การแฮชเป็นเรื่องเกี่ยวกับการพิมพ์ลายนิ้วมือ คุณไม่จำเป็นต้องกู้คืนต้นฉบับ แต่ต้องแน่ใจว่าเหมือนกัน การเข้ารหัสเป็นเรื่องเกี่ยวกับการแสดงข้อมูลเพื่อให้สามารถแลกเปลี่ยนข้อมูลได้ การเข้ารหัสไม่เกี่ยวข้องกับการรักษาความลับ
นี่คือคำอธิบายความยาว Twitter ของฉัน มาดูรายละเอียดกันดีกว่า!
การเข้ารหัส
การเข้ารหัสเป็นเรื่องเกี่ยวกับการแสดงข้อมูล ตัวอย่างเช่น สำหรับไอคอนบนเว็บ เราไม่ต้องการจัดเก็บไฟล์รูปภาพ แต่เก็บไว้บนหน้าเว็บโดยตรง ซึ่งจะป้องกันไม่ให้ไคลเอ็นต์สร้างคำขอ HTTP จำนวนมากสำหรับข้อมูลเพียงเล็กน้อย
แต่ข้อมูลไบนารี่ของรูปภาพจะต้องถูกแปลงเป็นข้อมูลข้อความ วิธีทั่วไปในการดำเนินการดังกล่าวคือ "การเข้ารหัส base64"
อย่างที่คุณเห็น "การแปล" นั้นไม่สำคัญ: เราสร้างบล็อกข้อมูลไบนารี่ขนาด 6 บิตและค้นหาอักขระในตารางด้านบน มันถูกเรียกว่า base64 เพราะมี 2⁶ = 64 หลัก จึงสามารถตีความได้ว่าเป็น "การแปลงฐานตัวเลข"
โปรดทราบว่าการดำเนินการนี้ไม่ได้เก็บความลับของเนื้อหา Base64 ไม่ได้ใช้รหัสลับ ดังนั้นจึงไม่ใช่การเข้ารหัส
การเข้ารหัสอักขระก็เป็นเรื่องปกติเช่นกัน พวกเขาจับคู่จำนวนเต็มกับอักขระ สามตัวที่ฉันสะดุดบ่อยที่สุดคือ UTF8, ASCII, Latin1
การเข้ารหัส
การเข้ารหัสเป็นเรื่องเกี่ยวกับการรักษาความลับ คุณไม่ต้องการเก็บวิธีที่คุณเข้ารหัสและถอดรหัสลับไว้ คุณควรมีรหัสลับที่จำเป็นในการถอดรหัสแทน สิ่งนี้เรียกว่าหลักการของ Kerckhoffs
ในทางคณิตศาสตร์ คุณมีสองฟังก์ชัน:
encrypt(plain text, key) -> cipher text decrypt(cipher text, key) -> plain text
สิ่งนี้เรียกว่าอัลกอริธึมคีย์สมมาตรเมื่อคุณใช้คีย์เดียวกันในการเข้ารหัสและถอดรหัส มีอัลกอริธึมคีย์ที่ไม่สมมาตรเช่นกัน แต่นี่อาจไปไกลเกินไป
แผนการเข้ารหัสในยุคแรกๆ คือการใช้ประโยคที่เป็นธรรมชาติเป็นกุญแจสำคัญในการเข้ารหัสอักขระตัวเดียว หากประโยคมีอักขระตัวหนึ่งหลายครั้ง อักขระตัวที่สองและอักขระต่อไปนี้จะถูกลบ:
Sentence : The quick brown fox jumps Derived key: the quickbrownfxjmpsadglvyz
จากนั้นคุณแปลทีละตัวอักษร:
Original : the quickbrownfxjmpsadglvyz Translates to: abcdefghijklmnopqrstuvwxyz
โปรดทราบว่า "ช่องว่าง" แปลว่า "d" และ "z" แปลว่า "ช่องว่าง"
เมื่อรวมทุกอย่างเข้าด้วยกัน ข้อความ secret
จะแปลเป็น tchkca
ใน Python ดูเหมือนว่านี้:
อัลกอริธึมการเข้ารหัสสมัยใหม่มีความซับซ้อนกว่าเล็กน้อย ความทันสมัยคือ AES — มาตรฐานการเข้ารหัสขั้นสูง การกล่าวถึงที่โดดเด่น ได้แก่ Twofish, Serpent, SM4 และ SEED
การแฮช
การแฮชเป็นเรื่องเกี่ยวกับการพิมพ์ลายนิ้วมือ คุณต้องการระบุรายการไบต์ได้โดยไม่ซ้ำกัน (เช่น สตริงหรือไฟล์) แต่คุณไม่ต้องการเก็บไว้ คุณไม่จำเป็นต้องสามารถกลับไปใช้ต้นฉบับได้หรือคุณไม่ต้องการมันด้วยซ้ำ เช่นเดียวกับลายนิ้วมือ: คุณสามารถใช้สองลายนิ้วมือและสรุปว่าเป็นของคนคนเดียวกัน แต่ด้วยลายนิ้วมือเดียว คุณไม่สามารถสร้างบุคคลนั้นขึ้นมาใหม่ได้
ฉันเขียนบทความที่อธิบายรายละเอียดว่าเหตุใดจึงต้องการการสูญเสียข้อมูล:
แต่ยังมีฟังก์ชันแฮชอื่นๆ อีกมากมายเช่นกัน:
ฟังก์ชันแฮชที่ล้ำสมัยคือ SHA-256 หรือ SHA-512