0Pricing
Cryptology Academy · บทเรียน

เข้ารหัสและถอดรหัส 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ภาพรวมไลบรารีการเข้ารหัสของ Python
  2. เข้ารหัสและถอดรหัส AES-GCM ใน Python
  3. คู่คีย์ RSA และ ECDSA ใน Python
  4. ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย
← กลับไปที่ Cryptology Academy