อาจปรากฏในบริบทเดียวกัน แต่มีความแตกต่างกันอย่างมาก

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

นี่คือคำอธิบายความยาว 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