I. Tổng quan về mật mã đối xứng (Symmetric ciphers)
1. Khái niệm
Symmetric ciphers - Mật mã đối xứng (hay mật mã khóa đối xứng, mã hóa đối xứng) là một dạng mã hóa truyền thống xuất hiện từ khá sớm. Trong đó, quá trình mã hóa (encryption) và giải mã (decryption) đều sử dụng chung một khóa (khóa bí mật - secret key). Ngoài ra, vai trò của hai bên là như nhau và có thể hoán đổi cho nhau, đây cũng là lý do loại mật mã này được gọi với cái tên "đối xứng". Cụ thể, bên gửi đưa văn bản rõ (plantext hay raw data) và khóa vào trong hàm chứa các chu trình mã hóa, kết quả thu được bản mã phức tạp (cipher text) và gửi đi, khi bên nhận nhận được bản mã, lại tiếp tục sử dụng khóa (giống với bên nhận) cùng bản mã đưa vào hàm chứa các chu trình giải mã và thu được thông điệp ban đầu.
2. Ưu, nhược điểm
Là một dạng mã hóa truyền thống được sử dụng phổ biến, rộng rãi, các thuật toán symmetric ciphers bao gồm nhiều ưu điểm:
- Quá trình mã hóa nhanh, khối lượng tính toán nhỏ bởi tính đơn giản so với một số thuật toán khác như mật mã bất đối xứng.
- Sử dụng khóa bí mật có độ dài ngắn có thể mã hóa được lượng thông tin truyền đạt lớn.
- Hiệu năng mã hóa cao.
Tuy nhiên, sau khi hiểu rõ quá trình mã hóa và giải mã được đưa ra phía trên, chúng ta dễ dàng nhận thấy nhược điểm của symmetric ciphers nằm ở chính khóa bí mật được sử dụng. Để truyền tải được thông điệp, người gửi và nhận cần sử dụng cùng một khóa, hay nói cách khác người nhận cần biết chính xác khóa của người gửi. Điều này dẫn đến trước khi trao đổi thông tin, hai bên cần trao đổi khóa bí mật trước, đây chính là rủi ro trọng yếu của mật mã đối xứng:
- Tính an toàn của khóa bí mật giữa hai bên không được đảm bảo.
- Mỗi cặp đối tượng gửi - nhận khi thực hiện trao đổi thông tin đều cần dùng một khóa duy nhất, dẫn đến một hệ lụy khác là vấn đề quản lý secret key.
Với các đặc điểm như trên, mật mã đối xứng phù hợp với các công việc có đặc thù truyền tải thông tin qua lại liên tục giữa hai bên.
3. Các dạng mật mã đối xứng
Dựa vào phương thức mã hóa, mật mã đối xứng có thể được chia làm hai loại: Mật mã dòng (Stream ciphers) và mật mã khối (Block ciphers).
3.1. Stream ciphers - Mật mã dòng
Stream ciphers - Mật mã dòng (hay còn được gọi là mật mã luồng) thực hiện mã hóa từng bit hoặc từng byte của thông điệp. Do đó thường được sử dụng với hình thức đồng bộ mã hóa - giải mã theo thời gian thực. Một số thuật toán mã hóa dòng phổ biến có thể kể đến như RC4 (Rivest's Cipher 4), SEAL (Software-optimized Encryption Algorithm), ...
3.2. Block ciphers - Mật mã khối
Block ciphers - Mật mã khối chia thông điệp thành từng nhóm rồi chuyển thành ma trận (khối) và thực hiện mã hóa với từng khối khác nhau, cuối cùng ghép lại thu được văn bản mã hóa. Phương thức mã hóa này nâng cao độ an toàn và tính thực tiễn, tuy nhiên giảm đáng kể khả năng thao tác và tính toán. Các thuật toán mã hóa khối phổ biến là DES (Data Encryption Standard), AES (Advanced Encryption Standard), ...
3.3. Bảng so sánh
Stream ciphers | Block ciphers | |
---|---|---|
Đặc điểm | Sử dụng dòng liên tục bit | Chia dữ liệu thành các khối cố định và xử lý mỗi khối một cách riêng biệt |
Tốc độ | Có thể đạt được tốc độ cao hơn do không cần chờ đủ một khối dữ liệu để mã hóa | Tốc độ chậm hơn do phải xử lý từng khối một cách riêng biệt |
Độ tin cậy | Dễ bị ảnh hưởng bởi lỗi đồng bộ và lỗi tuần tự | Ít bị ảnh hưởng bởi lỗi đồng bộ và lỗi tuần tự |
II. Thuật toán AES - giới thiệu
1. Tổng quan
Thuật toán AES (Advanced Encryption Standard) là một trong những dạng thuật toán mã hóa đối xứng phổ biến nhất. AES dựa trên thuật toán Rijindael - được thiết kế bởi hai nhà mật mã học J. Daemen và V. Rijmen. Vào ngày , viện tiêu chuẩn và công nghệ quốc gia Hoa Kỳ NIST (National Institute of Standards and Technology) lựa chọn thuật toán Rijindael triển khai cho mật mã AES với các lý do:
- Rijindael có thể kháng chịu các cuộc tấn công mật mã đã biết từ trước.
- Thuật toán tương tác tốt với phần cứng, phần mềm, tốc độ thực hiện nhanh.
- Thời gian thiết lập khóa bí mật ngắn, đồng thời đảm bảo tính linh hoạt.
- Không yêu cầu dung lượng bộ nhớ cao.
Quy trình mã hóa và giải mã tổng quát của thuật toán có thể được quan sát qua sơ đồ sau:
Dựa vào sơ đồ trên, ký hiệu khóa bí mật là K
, văn bản cần mã hóa (thông điệp) là P
, hàm mã hóa AES là E()
, chúng ta thu được bản mã C
qua công thức:
C = E(P, K)
Với hàm giải mã AES ký hiệu là D()
, bên nhận thu được thông điệp qua:
P = D(C, K)
Cụ thể, văn bản rõ và khóa được trở thành đầu vào trong hàm mã hóa thu được output là văn bản mã hóa, tiếp tục đưa văn bản mã hóa cùng khóa vào hàm giải mã nhận được văn bản rõ.
2. Cấu tạo cơ bản
AES thuộc dạng mật mã khối, tức trong quá trình mã hóa sẽ chia thông điệp thành từng nhóm (ở dạng khối), mỗi nhóm có độ lớn bằng nhau và thực hiện mã hóa từng khối lần lượt rồi ghép lại thu được văn bản mã hóa. Thuật toán AES tiêu chuẩn quy định mỗi khối có độ lớn bit: bao gồm byte ( byte = bit).
Thuật toán AES còn được chia làm ba loại: AES-128, AES-192, AES-256. Có thể phân biệt các loại dựa trên độ dài của khóa (secret) cũng như số lần (vòng) mã hóa đối với mỗi khối (Rounds). Cụ thể tham khảo bảng sau:
AES | Độ lớn mỗi khối (block) | Độ lớn khóa bí mật (secret key) | Số vòng mã hóa trong mỗi khối (Rounds) |
---|---|---|---|
AES-128 | 128 bit | 128 bit | 10 |
AES-192 | 128 bit | 192 bit | 12 |
AES-256 | 128 bit | 256 bit | 14 |
(Trong khuôn khổ bài viết về chủ đề thuật toán AES, chúng ta sẽ tập trung tìm hiểu loại AES-128)
Nếu coi một lần thực hiện mã hóa một khối tương ứng với hàm E()
được thực thi một lần, thì AES-128 trong quá trình mã hóa sẽ thực thi hàm E()
lần. Ngược lại, khi thực hiện giải mã, hàm D()
trong AES-128 cũng sẽ được thực hiện lần.
Ví dụ với thuật toán AES-128, mode CBC, thông điệp Viblo
sử dụng secret key 0123456789abcdef
sau khi được mã hóa thu được bãn mã ở dạng Base64 là qM4mRZBkIrQzbwE6JYz3HA==
.