คู่คีย์ RSA และ ECDSA ใน Python
สร้าง แปลงรูปแบบ และใช้คีย์ RSA กับ EC สำหรับการลงนามและการเข้ารหัส
คู่คีย์ RSA และ ECDSA ใน Python เป็นบทเรียน Cryptology Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cryptology Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมการดำเนินการกับคู่กุญแจ
ไลบรารี cryptography ของ Python รองรับ RSA และ ECDSA สำหรับการสร้างกุญแจ การลงนาม การตรวจสอบ การทำให้เป็นลำดับข้อมูล และการโหลด สิ่งเหล่านี้เป็นองค์ประกอบพื้นฐานของใบรับรอง TLS การลงนามโค้ด และ JWT
การสร้างคู่กุญแจ RSA
ค่าขั้นต่ำที่แนะนำคือ 2048 บิตเพื่อความเข้ากันได้ และ 4096 บิตสำหรับกุญแจที่ต้องใช้งานเป็นเวลานาน:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
public_key = private_key.public_key()
print("RSA key generated, size:", private_key.key_size, "bits")การลงนาม RSA ด้วย PSS
ควรใช้การเติมแพดดิ้งแบบ PSS สำหรับลายเซ็นเสมอ (ไม่ใช่ PKCS#1 v1.5):
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
message = b"document to sign"
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("RSA-PSS signature:", signature.hex()[:32], "...")การตรวจสอบลายเซ็น RSA
การตรวจสอบจะแสดง InvalidSignature เมื่อไม่สำเร็จ:
from cryptography.exceptions import InvalidSignature
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("Signature valid!")
except InvalidSignature:
print("Signature INVALID")การสร้างคู่กุญแจ ECDSA
ECDSA ที่ใช้ NIST P-256 (secp256r1) ให้ความปลอดภัยระดับ 128 บิตด้วยกุญแจที่เล็กกว่า RSA-3072 มาก:
from cryptography.hazmat.primitives.asymmetric import ec
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
print("EC private key generated on curve:", private_key.curve.name)การลงนามและตรวจสอบ ECDSA
โดยค่าเริ่มต้น ECDSA จะใช้ลายเซ็นที่เข้ารหัสแบบ DER:
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.exceptions import InvalidSignature
# Sign
sig = private_key.sign(b"my data", ec.ECDSA(hashes.SHA256()))
print("ECDSA signature bytes:", len(sig))
# Verify
try:
public_key.verify(sig, b"my data", ec.ECDSA(hashes.SHA256()))
print("ECDSA signature valid")
except InvalidSignature:
print("Invalid")การทำให้กุญแจเป็นลำดับข้อมูลในรูปแบบ PEM
บันทึกกุญแจลงในไฟล์ PEM เพื่อจัดเก็บหรือแจกจ่าย:
from cryptography.hazmat.primitives import serialization
# Private key — encrypted with passphrase
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(b"strong-passphrase")
)
# Public key — no encryption
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_pem.decode()[:64])การโหลดกุญแจจาก PEM
โหลดกุญแจที่จัดเก็บไว้กลับเข้าเป็นออบเจ็กต์:
from cryptography.hazmat.primitives.serialization import (
load_pem_private_key, load_pem_public_key
)
with open("ec_private.pem", "rb") as f:
priv = load_pem_private_key(f.read(), password=b"strong-passphrase")
with open("ec_public.pem", "rb") as f:
pub = load_pem_public_key(f.read())
print("Loaded EC key curve:", priv.curve.name)การตกลงกุญแจด้วย ECDH
ใช้ ECDH เพื่ออนุมานความลับร่วมสำหรับการเข้ารหัสสมมาตร:
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
alice_priv = ec.generate_private_key(ec.SECP256R1())
bob_priv = ec.generate_private_key(ec.SECP256R1())
# Alice computes shared secret
shared = alice_priv.exchange(ec.ECDH(), bob_priv.public_key())
aes_key = HKDF(hashes.SHA256(), 32, None, b"app-context").derive(shared)
print("Derived AES key:", aes_key.hex())การเข้ารหัส RSA ด้วย OAEP
สำหรับการเข้ารหัสข้อมูลขนาดเล็ก (เช่น DEK) ด้วย RSA — ควรใช้ OAEP เสมอ:
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# Encrypt with public key
ciphertext = public_key.encrypt(
b"small secret",
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Decrypt with private key
plaintext = private_key.decrypt(ciphertext, padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None
))
print("Decrypted:", plaintext)การเลือก RSA หรือ ECDSA
ECDSA: ลายเซ็นมีขนาดเล็กกว่า (ประมาณ 71 ไบต์สำหรับ P-256 เทียบกับประมาณ 256 ไบต์สำหรับ RSA-2048) ลงนามได้เร็วกว่า และมีระดับความปลอดภัยเท่ากัน RSA: รองรับระบบเดิมได้กว้างกว่าและมีแบบจำลองความเข้าใจที่ง่ายกว่า สำหรับระบบใหม่ ให้ใช้ ECDSA P-256 หรือ Ed25519
ตรวจสอบความรู้
เหตุใดจึงควรเลือก RSA-PSS แทน PKCS#1 v1.5 สำหรับลายเซ็นดิจิทัล
สรุปบทเรียน
ใช้ rsa.generate_private_key สำหรับ RSA และ ec.generate_private_key สำหรับ ECDSA ลงนามด้วย PSS (RSA) หรือ ECDSA + SHA-256 ทำให้กุญแจเป็นลำดับข้อมูลในรูปแบบ PEM ด้วยรูปแบบ PKCS8 และการเข้ารหัสด้วยข้อความรหัสผ่าน ใช้ ECDH สำหรับการตกลงกุญแจ สำหรับระบบใหม่ควรเลือก ECDSA P-256 หรือ Ed25519
คำถามที่พบบ่อย
บทเรียน “คู่คีย์ RSA และ ECDSA ใน Python” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คู่คีย์ RSA และ ECDSA ใน Python” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cryptology Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cryptology Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คู่คีย์ RSA และ ECDSA ใน Python”
สร้าง แปลงรูปแบบ และใช้คีย์ RSA กับ EC สำหรับการลงนามและการเข้ารหัส คุณปฏิบัติ Cryptology Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cryptology Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cryptology Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “คู่คีย์ RSA และ ECDSA ใน Python” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cryptology Academy นี้ได้ไหม
ได้ บทเรียน Cryptology Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมไลบรารีการเข้ารหัสของ Python
- เข้ารหัสและถอดรหัส AES-GCM ใน Python
- คู่คีย์ RSA และ ECDSA ใน Python
- ข้อผิดพลาดที่พบบ่อยในการเข้ารหัสด้วย Python และรูปแบบที่ปลอดภัย