Mật mã cơ bản: thay thế, hoán vị, băm, đối xứng
Thuật ngữ mật mã, mã thay thế hoán vị, thám mã, hàm băm MD5 SHA và mã đối xứng.
Trung bìnhThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học mã cổ điển, hàm băm và mã đối xứng. Bạn dùng nó để giữ mật khẩu và file an toàn.
Kiến thức cần nhớ
Thuật ngữ và mắt xích yếu
- Bản rõ là tin gốc, bản mã là tin đã khóa.
- Khóa là bí mật điều khiển cách khóa và mở.
- Hệ mạnh như khâu yếu nhất: mật khẩu yếu là gãy.
- Ví dụ đời thường: ổ khóa tốt nhưng để chìa dưới thảm thì vô dụng.
Mã thay thế và hoán vị
- Thay thế: đổi từng chữ theo bảng, ví dụ Caesar dịch 3 nấc.
- Hoán vị: giữ nguyên chữ, chỉ xáo vị trí.
- Thay thế giữ nguyên tần suất nên dễ bẻ bằng đếm chữ.
- Ví dụ đời thường: chữ e nhiều nhất nên ký tự lạ nào nhiều nhất likely là e.
# Caesar dịch 3
def caesar(s):
return "".join(chr((ord(c)-97+3)%26+97) for c in s) # dịch mỗi chữ đi 3
print(caesar("abc")) # -> def
Hàm băm MD5 và SHA
- Định nghĩa: nhét dữ liệu dài tùy ý, ra mã ngắn cố định.
- Cùng đầu vào cho cùng đầu ra, khác 1 bit là khác hẳn.
- Không đảo ngược được để lấy lại gốc.
- Ví dụ đời thường: như lấy dấu vân tay, không dựng lại người từ vân tay.
- MD5 đã gãy va chạm, chỉ kiểm lỗi thường; SHA-256 dùng cho việc nghiêm túc.
Mã đối xứng
- Định nghĩa: một khóa chung vừa khóa vừa mở.
- Ví dụ đời thường: một chìa vừa khóa vừa mở vali.
- Ưu điểm: nhanh, hợp mã lượng lớn như video.
- Nhược điểm: khó chia sẻ khóa an toàn cho nhiều người.
Ba bước xác định yêu cầu bảo mật
- Xác định các thực thể: ai gửi, ai nhận, ai có thể tấn công.
- Đặt mục tiêu bảo mật: bí mật (chỉ người được phép đọc), toàn vẹn (không bị sửa lén), xác thực (đúng người gửi), chống chối bỏ.
- Đánh giá độ nhạy của dữ liệu: dữ liệu càng nhạy, khóa càng dài và kiểm soát càng chặt.
Ví dụ
- Input:
abcCaesar dịch 3. Output:def. - Giải thích: mỗi chữ tiến 3 nấc trong bảng chữ cái.
- Input: 2 file khác nhau cho cùng MD5. Output: báo va chạm, chuyển sang SHA.
- Giải thích: MD5 không còn an toàn cho toàn vẹn nghiêm túc.
💻 Bài tập
Ngôn ngữ: Python 3. Bài 3 dùng thư viện cryptography. Nộp vào day-062/.
Mọi thuật toán tự cài trong bài này chỉ để học. Không dùng chúng để bảo vệ dữ liệu thật.
Bài 1: Mật mã cổ điển
| Hàm | Yêu cầu |
|---|---|
caesar(text, shift) | Dịch chữ cái a-z, A-Z, giữ nguyên ký tự khác. shift âm để giải mã |
vigenere(text, key, decrypt=False) | Dịch theo từng chữ của khóa |
rail_fence(text, rails) và rail_fence_decrypt | Hoán vị hàng rào |
caesar("abc", 3) -> "def"
caesar("Xyz!", 3) -> "Abc!"
vigenere("ATTACKATDAWN", "LEMON") -> "LXFOPVEFRNHR"
rail_fence("WEAREDISCOVERED", 3) -> "WECRERDSOEEAIVD"
Bài 2: Bẻ khóa bằng tần suất
break_caesar(ciphertext): thử 26 khóa, chọn khóa có phân bố chữ gần tiếng Anh nhất (chi bình phương).- Mã hóa 1 đoạn văn tiếng Anh 500 chữ bằng Caesar khóa ngẫu nhiên. Bẻ lại đúng khóa.
- Viết 3 câu: vì sao thay thế đơn giữ tần suất nên dễ bẻ, và Vigenère khó hơn ở điểm nào.
Bài 3: Băm và mã hóa đối xứng (nâng cao)
- Dùng
hashlib.sha256. Đổi 1 bit đầu vào, đếm số bit khác nhau của 2 mã băm (hiệu ứng thác, kỳ vọng khoảng 128/256). - Lưu mật khẩu đúng cách:
hashlib.scrypthoặcpbkdf2_hmacvới salt ngẫu nhiên 16 byte. Viếthash_passwordvàverify_password. Giải thích vì sao không lưusha256(password). - Mã hóa file bằng AES-GCM (
cryptography.hazmat.primitives.ciphers.aead.AESGCM). Sửa 1 byte bản mã, chứng minh giải mã báo lỗi xác thực.
✅ Tiêu chí hoàn thành
- Test mẫu pass, giải mã đúng lại bản rõ.
-
break_caesartìm đúng khóa trên đoạn 500 chữ. - Bài 3 cho thấy hiệu ứng thác và phát hiện bản mã bị sửa.
- Không có mật khẩu hay khóa thật nào trong repo.
❓ Câu hỏi ôn tập
- Bản rõ, bản mã và khóa là gì?
- Vì sao mã thay thế dễ bẻ bằng tần suất?
- MD5 và SHA khác nhau thế nào?
- Bài toán chia sẻ khóa của mã đối xứng là gì?
🌕 Bạn đã hoàn thành ngày 62. Làm hết bài tập phía trên rồi sang ngày tiếp theo.