เข้ารหัสและถอดรหัส AES-GCM ใน Python
สร้างการเข้ารหัสพร้อมการพิสูจน์ตัวตนโดยจัดการนอนซ์อย่างเหมาะสม
เข้ารหัสและถอดรหัส AES-GCM ใน Python เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้ AES-GCM
AES-GCM เป็นรูปแบบการเข้ารหัสที่ยืนยันความถูกต้องพร้อมข้อมูลที่เกี่ยวข้อง (Authenticated Encryption with Associated Data (AEAD)) โดยให้ทั้งการรักษาความลับ (AES-CTR) และความครบถ้วนถูกต้อง/ความน่าเชื่อถือ (MAC ของ GHASH) ในกระบวนการเดียว จึงเป็นมาตรฐานสำหรับการเข้ารหัสสมัยใหม่
องค์ประกอบของ GCM: CTR + GHASH
AES-GCM = AES ในโหมดตัวนับ (การเข้ารหัส) + MAC พหุนามของ GHASH (การยืนยันความถูกต้อง) แท็กยืนยันความถูกต้องขนาด 128 บิตครอบคลุมทั้งข้อความเข้ารหัสและข้อมูลเพิ่มเติมที่ผ่านการยืนยันความถูกต้อง (AAD) ซึ่งเป็นข้อมูลเสริมที่อาจมีหรือไม่มีก็ได้
ข้อกำหนดของนอนซ์
ห้ามใช้นอนซ์ขนาด 96 บิตซ้ำโดยเด็ดขาดเมื่อใช้กับกุญแจเดียวกัน การใช้ นอนซ์ซ้ำจะทำลายความปลอดภัยของ GCM อย่างสิ้นเชิง ผู้โจมตีจะกู้คืนกุญแจสำหรับการยืนยันความถูกต้องได้และปลอมแปลงข้อความเข้ารหัสได้ ควรใช้นอนซ์แบบสุ่มหรือตัวนับร่วมกับการหมุนเวียนกุญแจ
การเข้ารหัสด้วย AES-GCM ใน Python
โดยใช้ชั้นวัสดุอันตราย:
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)
plaintext = b"sensitive payload"
aad = b"user_id=42" # authenticated but not encrypted
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())การถอดรหัสด้วย AES-GCM ใน Python
การถอดรหัสจะตรวจสอบแท็กโดยอัตโนมัติ และแสดง InvalidTag เมื่อไม่สำเร็จ:
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag
# key, nonce, ciphertext, aad from previous step
try:
recovered = aesgcm.decrypt(nonce, ciphertext, aad)
print("Decrypted:", recovered)
except InvalidTag:
print("Authentication failed — ciphertext tampered!")การจัดเก็บนอนซ์และข้อความเข้ารหัส
เติมนอนซ์ไว้ด้านหน้าข้อความเข้ารหัสก่อนจัดเก็บ เมื่อต้องถอดรหัส ให้แยกที่ไบต์ที่ 12:
def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce = os.urandom(12)
ct = aesgcm.encrypt(nonce, data, aad or None)
return nonce + ct # prepend nonce
def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce, ct = blob[:12], blob[12:]
return aesgcm.decrypt(nonce, ct, aad or None)ข้อมูลเพิ่มเติมที่ผ่านการยืนยันความถูกต้อง (AAD)
AAD จะได้รับการยืนยันความถูกต้องแต่ไม่ถูกเข้ารหัส ใช้ AAD เพื่อผูกข้อความเข้ารหัสเข้ากับบริบท เช่น ID ผู้ใช้ ID ระเบียน หรือรุ่นของ API ซึ่งช่วยป้องกันไม่ให้ผู้โจมตีย้ายข้อความเข้ารหัสที่ถูกต้องไปยังบริบทอื่น
การใช้ API การเข้ารหัสระดับต่ำ
สำหรับการเข้ารหัสแบบสตรีมหรือการเข้ารหัสแทนที่ข้อมูลเดิม ให้ใช้ API การเข้ารหัสกับโหมด GCM โดยตรง:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())ความต้านทานต่อการใช้ นอนซ์ผิด: AES-GCM-SIV
AES-GCM-SIV (RFC 8452) ทนต่อการใช้ นอนซ์ผิด: การใช้นอนซ์ซ้ำจะเปิดเผยว่าข้อความต้นฉบับสองข้อความเหมือนกัน แต่จะไม่ทำลายความน่าเชื่อถือ ควรเลือกใช้เมื่อรับรองความไม่ซ้ำกันของนอนซ์ได้ยาก
การอนุมานกุญแจก่อนการเข้ารหัส
ห้ามใช้รหัสผ่านดิบเป็นกุญแจ AES โดยเด็ดขาด ควรอนุมานกุญแจด้วย Argon2 หรือ HKDF:
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os
master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())ข้อควรพิจารณาด้านประสิทธิภาพ
การเร่งความเร็วด้วยฮาร์ดแวร์ AES-NI ทำให้ AES-GCM ทำงานได้เร็วมาก (ประมาณ 1–4 GB/s บนหน่วยประมวลผลรุ่นใหม่) Python cryptography ใช้ OpenSSL ซึ่งใช้ประโยชน์จาก AES-NI สำหรับไฟล์ที่มีขนาดเกิน 100 MB ให้ใช้การสตรีมแบบแบ่งเป็นส่วนร่วมกับ API การเข้ารหัสระดับต่ำ
ตรวจสอบความรู้
จะเกิดอะไรขึ้นหากใช้นอนซ์เดียวกันสองครั้งกับ AES-GCM ภายใต้กุญแจเดียวกัน
สรุปบทเรียน
AES-GCM ให้การเข้ารหัสที่ยืนยันความถูกต้องได้ในกระบวนการเดียว ควรใช้นอนซ์สุ่มขนาด 96 บิตค่าใหม่สำหรับการเข้ารหัสแต่ละครั้ง เติมนอนซ์ไว้ด้านหน้าข้อความเข้ารหัสเพื่อจัดเก็บ AAD จะผูกข้อความเข้ารหัสเข้ากับบริบท AES-GCM-SIV ทนต่อการใช้นอนซ์ผิด ควรอนุมานกุญแจด้วย HKDF และห้ามใช้รหัสผ่านดิบ
คำถามที่พบบ่อย
บทเรียน “เข้ารหัสและถอดรหัส AES-GCM ใน Python” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เข้ารหัสและถอดรหัส AES-GCM ใน Python” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เข้ารหัสและถอดรหัส AES-GCM ใน Python”
สร้างการเข้ารหัสพร้อมการพิสูจน์ตัวตนโดยจัดการนอนซ์อย่างเหมาะสม คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “เข้ารหัสและถอดรหัส AES-GCM ใน Python” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมไลบรารีการเข้ารหัสของ Python
- เข้ารหัสและถอดรหัส AES-GCM ใน Python
- คู่คีย์ RSA และ ECDSA ใน Python
- ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย