Ở phần 1, đã giới thiệu tổng quan về bảo mật thông tin, các nguyên lý về bảo mật thông tin và có một cái nhìn chung nhất về mật mã học, cách phân loại các thuật toán mã hoá. Trong phần 2, hãy cùng tìm hiểu về mã hoá đối xứng (hay còn gọi là mã hoá khoá bí mật) và một số mã hoá đặc trưng cho hệ mật này là DES, 2DES, 3DES, AES…
Mã hoá đối xứng
1. Mã hoá đối xứng là gì?
Mã hóa khóa đối xứng (hay còn gọi là mã hóa khóa bí mật) là một thuật toán mà trong đó cả hai quá trình mã hóa và giải mã đều dùng một khóa. Để đảm bảo tính an toàn, khóa này phải được giữ bí mật. Vì thế các thuật toán mã hóa khóa đồng bộ này còn có tên gọi khác là mã hóa với khóa bí mật (secret key cryptography).
Mã hóa khóa đối xứng có thể phân thành hai nhóm phụ:
Thuật toán mã hóa theo khối (Block ciphers): trong đó từng khối dữ liệu trong văn bản gốc ban đầu được thay thế bằng một khối dữ liệu khác có cùng độ dài. Độ dài mỗi khối gọi là kích thước khối (block size), thường được tính bằng đơn vị bit. Ví dụ thuật toán 3-Way có kích thước khối bằng 96 bit. Một số thuật toán khối thông dụng là: DES, 3DES, RC5, RC6, 3-Way, CAST, Camelia, Blowfish, MARS, Serpent, Twofish, GOST…
Thuật toán mã hóa dòng (Stream ciphers): trong đó dữ liệu đầu vào được mã hóa từng bit một. Các thuật toán dòng có tốc độ nhanh hơn các thuật toán khối, được dùng khi khối lượng dữ liệu cần mã hóa chưa được biết trước, ví dụ trong kết nối không dây. Có thể coi thuật toán dòng là thuật toán khối với kích thước mỗi khối là 1 bit. Một số thuật toán dòng thông dụng: RC4, A5/1, A5/2, Chameleon.
2. Mã hoá DES
DES – Data Encryption Standard là một mã khối, mỗi khối gồm 64 bit trong đó dành 8 bit để kiểm tra lỗi (Parity checking) còn lại 56 bit khóa. Cấu trúc tổng thể của thuật toán như hình bên dưới.
Mô tả thuật toán
Có 16 chu trình giống nhau trong quá trình xử lý. Ngoài ra còn có hai lần hoán vị đầu và cuối (Initial and final permutation: IP & FP). Hai quá trình này có tính chất đối nhau (trong quá trình mã hóa thì IP trước FP, khi giải mã thì ngược lại). Trước khi đi vào 16 chu trình chính, khối thông tin 64 bit được tách làm hai phần 32 bit và mỗi phần sẽ được xử lý tuần tự (quá trình này còn được gọi là mạng Feistel).
Hàm Feistel (F)
Hàm F hoạt động trên khối 32 bit và bao gồm bốn giai đoạn
- Mở rộng: 32 bit đầu vào được mở rộng thành 48 bit sử dụng thuật toán hoán vị mở rộng (expansion permutation) với việc nhân đôi một số bit. Giai đoạn này được ký hiệu là E trong sơ đồ.
- Trộn khóa: 48 bit thu được sau quá trình mở rộng được XOR với khóa con. Mười sáu khóa con 48 bit được tạo ra từ khóa chính 56 bit theo một chu trình tạo khóa con.
- Thay thế: 48 bit sau khi trộn được chia làm 8 khối con 6 bit và được xử lý qua hộp thay thế S-box. Đầu ra của mỗi khối 6 bit là một khối 4 bit theo một chuyển đổi phi tuyến được thực hiện bằng một bảng tra. Khối S-box đảm bảo phần quan trọng cho độ an toàn của DES. Nếu không có S-box thì quá trình sẽ là tuyến tính và việc thám mã sẽ rất đơn giản.
- Hoán vị: Cuối cùng, 32 bit thu được sau S-box sẽ được sắp xếp lại theo một thứ tự cho trước (còn gọi là P-box)
Quá trình tạo khoá con (Sub-key)
Đầu tiên, từ 64 bit ban đầu của khóa, 56 bit được chọn (Permuted Choice 1, hay PC-1); 8 bit còn lại bị loại bỏ. 56 bit thu được được chia làm hai phần bằng nhau, mỗi phần được xử lý độc lập. Sau mỗi chu trình, mỗi phần được dịch đi 1 hoặc 2 bit (tùy thuộc từng chu trình).
Các khóa con 48 bit được tạo thành bởi thuật toán lựa chọn 2 (Permuted Choice 2, hay PC-2) gồm 24 bit từ mỗi phần. Quá trình dịch chuyển bit (được ký hiệu là “<<<” trong sơ đồ) khiến cho các khóa con sử dụng các bit khác nhau của khóa chính; mỗi bit được sử dụng trung bình là 14 trong tổng số 16 khóa con.
Thám mã DES
Tấn công vét cạn (Bruce force attack): đối với bất cứ phương pháp mã hóa nào, kiểu tấn công cơ bản nhất là tấn công bằng vét cạn: thử lần lượt tất cả các khóa có thể cho đến khi tìm ra khóa đúng. Độ dài của khóa sẽ xác định số lượng phép thử tối đa cần thực hiện và do đó thể hiện tính khả thi của phương pháp. Trong trường hợp của DES, nghi ngờ về độ an toàn của nó đã được đặt ra ngay từ khi nó chưa trở thành tiêu chuẩn. Người ta cho rằng chính NSA đã ủng hộ IBM giảm độ dài khóa từ 128 bit xuống 64 bit và tiếp tục xuống 56 bit. (Điều này dẫn đến suy đoán rằng NSA đã có thể có hệ thống tính toán đủ mạnh để phá vỡ khóa 56 bit ngay từ những năm 1970). Đã có nhiều hệ thống được xây dựng để duyệt hết mọi khoá DES trong một thời gian xác định.
Phá mã vi sai DC (DifferentialCryptanalysis): đòi hỏi dùng 247 plaintexts được xem là do Eli Biham và Adi Shamir tìm ra vào cuối những năm 1980 mặc dù đã được IBM và NSA biết đến trước đó để phá mã DES với đủ 16 chu trình (nhưng chưa có công bố chính thức).
Phá mã tuyến tính LC (Linear Cryptanalysis): được tìm ra bởi Mitsuru Matsui, đòi hỏi 243 plaintexts (Matsui, 1993). Phương pháp này đã được Matsui thực hiện và là cuộc thực nghiệm phá mã đầu tiên được công bố. Không có bằng chứng chứng tỏ DES có khả năng chống lại tấn công dạng này.
Phá mã Davies (Davies’ attack): là một kỹ thuật dành riêng cho DES. Dạng tấn công này được đề xuất lần đầu bởi Davies vào cuối những năm 1980 và cải tiến bởi Biham và Biryukov (1997). Dạng tấn công mạnh đòi hỏi 250 plaintexts, độ phức tạp là 250 và tỷ lệ thành công là 51%.
*** Để tăng độ an toàn, người sử dụng DES trước đây chuyển sang dùng Double DES và Triple DES (2DES và TDES). 2DES thực hiện 2 lần thuật toán mã hóa DEA với hai khóa riêng biệt, tăng độ dài khóa từ 56 lên 112 bit. Thoạt đầu người ta nghĩ rằng, theo tính toán thì tăng thêm 1 bit của độ dài khóa thì độ phức tạp của khóa (số trường hợp phải duyệt trong tấn công vét cạn) tăng gấp đôi. Và như vậy thì độ phức tạp khóa trong 2DES lên đến 256 lần so với khóa trong DES! Nhưng Whitfield Diffie và Martin Hellman đã phát minh ra một phương pháp thám mã gọi là tấn công gặp tại điểm giữa (meet–in– the–middle attack) làm cho độ phức tạp của 2DES chỉ tăng gấp đôi của DES tức là chỉ bằng: 2.256 = 257. Triple DES cũng sử dụng DES ba lần cho một plaintext với những khóa khác nhau để làm tăng độ dài khóa lên.
Đặc điểm về cách giải mã
Thuật toán mã hóa theo chuẩn DES có tính chất bù, nghĩa là
trong đó
là phần bù của x theo từng bit (1 thay bằng 0 và ngược lại). EK là bản mã hóa của E với khóa K. P và C là plaintext (trước khi mã hóa) và ciphertext (sau khi mã hóa). Do tính bù, ta có thể giảm độ phức tạp của tấn công vét cạn xuống 2 lần (tương ứng với 1 bit) với điều kiện là ta có thể lựa chọn plaintextx
Ngoài ra DES còn có 4 khóa yếu (weak keys). Khi sử dụng khóa yếu thì mã hóa (E) và giải mã (D) sẽ cho ra cùng kết quả:
Bên cạnh đó, còn có 6 cặp khóa nửa yếu (semi-weak keys). Mã hóa với một khóa trong cặp K1, tương đương với giải mã với khóa còn lại K2:
Tuy nhiên có thể dễ dàng tránh được những khóa này khi thực hiện thuật toán, có thể bằng cách thử hoặc chọn khóa ngẫu nhiên thì khả năng chọn phải khóa yếu là rất nhỏ.
DES đã được chứng minh là không tạo thành nhóm. Nói một cách khác, tập hợp {EK} (cho tất cả các khóa có thể) với phép hợp thành U không tạo thành một nhóm hay nhiều nhóm (pseudo-group) (kết quả của Campbell and Wiener, 1992).
*** Vấn đề này đã từng là một câu hỏi mở trong khá lâu. Nếu như tạo thành nhóm thì DES có thể bị phá vỡ dễ dàng hơn bởi vì việc áp dụng DES nhiều lần (ví dụ như trong 2DES, Triple DES) sẽ không làm tăng thêm độ an toàn của DES.
3. Mã hoá AES
AES viết tắt của Advanced Encryption Standard. Xuất hiện theo lời kêu gọi của NIST, cần phải phát triển một thuật toán mới thay thế cho DES. AES chính thức thay thế cho DES vào tháng 11 năm 2001. Nó hỗ trợ độ lớn nhỏ nhất của khóa là 128, 192 và 256 bits. Và hiện giờ nó đang được sử dụng một cách rộng rãi.
Mô tả thuật toán
AES làm việc với khối dữ liệu 128 bit và khóa có độ dài 128, 192 hoặc 256 bit. Các khóa con sử dụng trong các chu trình được tạo bởi quá trình tạo khóa con Rijndael. Hầu hết các phép toán trong thuật toán AES đều thực hiện trong một trường hữu hạn.
Quá trình mã hoá
Quá trình mã hoá bao gồm 4 bước:
- AddRoundKey: mỗi byte của khối được kết hợp với khóa con, các khóa con này được tạo ra từ quá trình tạo khóa con Rijndael.
- SubBytes: đây là phép thế (phi tuyến) trong đó mỗi byte sẽ được thế bằng một byte khác theo bảng tra (Rijndael S-box).
- ShiftRows: đổi chỗ, các hàng trong khối được dịch vòng.
- MixColumns: quá trình trộn làm việc theo các cột trong khối theo một phép biến đổi tuyến tính. Tại chu trình cuối thì bước MixColumns được thay thế bằng bước AddRoundKey
AddRoundKey: tại bước này, khóa con được kết hợp với các khối. Khóa con trong mỗi chu trình được tạo ra từ khóa chính với quá trình tạo khóa con Rijndael; mỗi khóa con có độ dài giống như các khối. Quá trình kết hợp được thực hiện bằng cách XOR từng bit của khóa con với khối dữ liệu.
SubBytes: các byte được thế thông qua bảng tra S-box. Đây chính là quá trình phi tuyến của thuật toán. Hộp S-box này được tạo ra từ một phép nghịch đảo trong trường hữu hạn GF(28) có tính chất phi tuyến. Để chống lại các tấn công dựa trên các đặc tính đại số, hộp S-box này được tạo nên bằng cách kết hợp phép nghịch đảo với một phép biến đổi affine khả nghịch. Hộp S-box này cũng được chọn để tránh các điểm bất động (fixed point).
Bước ShiftRows: các hàng được dịch vòng một số vị trí nhất định. Đối với AES, hàng đầu được giữ nguyên. Mỗi byte của hàng thứ 2 được dịch trái một vị trí. Tương tự, các hàng thứ 3 và 4 được dịch 2 và 3 vị trí. Do vậy, mỗi cột khối đầu ra của bước này sẽ bao gồm các byte ở đủ 4 cột khối đầu vào.
Bước MixColumns: 4 byte trong từng cột được kết hợp lại theo một phép biến đổi tuyến tính khả nghịch. Mỗi khối 4 byte đầu vào sẽ cho một khối 4 byte ở đầu ra với tính chất là mỗi byte ở đầu vào đều ảnh hưởng tới cả 4 byte đầu ra. Cùng với bước ShiftRows, MixColumns đã tạo ra tính chất khuếch tán cho thuật toán. Mỗi cột trong ma trận được xem như một đa thức trong trường hữu hạn và được nhân với đa thức c(x) = 3x3 + x2 + x + 2 (modulo x4 + 1). Vì thế, bước này có thể được xem là phép nhân ma trận trong trường hữu hạn.
Tối ưu hoá thuật toán
Đối với các hệ thống 32 bit hoặc lớn hơn, ta có thể tăng tốc độ thực hiện thuật toán bằng cách sát nhập các bước SubBytes, ShiftRows, MixColumns và chuyển chúng thành dạng bảng. Có cả thảy 4 bảng với 256 mục, mỗi mục là 1 từ 32 bit, 4 bảng này chiếm 4096 byte trong bộ nhớ. Khi đó, mỗi chu trình sẽ được bao gồm 16 lần tra bảng và 12 lần thực hiện phép XOR 32 bit cùng với 4 phép XOR trong bước AddRoundKey. Trong trường hợp kích thước các bảng vẫn lớn so với thiết bị thực hiện thì chỉ dùng một bảng và tra bảng kết hợp với hoán vị vòng quanh.
Độ an toàn của AES
Vào thời điểm năm 2006, dạng tấn công lên AES duy nhất thành công là tấn công kênh bên (side channel attack). Vào tháng 6 năm 2003, Chính phủ Hoa Kỳ tuyên bố AES có thể được sử dụng cho thông tin mật.
"Thiết kế và độ dài khóa của thuật toán AES (128, 192 và 256 bit) là đủ an toàn để bảo vệ các thông tin được xếp vào loại TỐI MẬT (secret). Các thông tin TUYỆT MẬT (top secret) sẽ phải dùng khóa 192 hoặc 256 bit. Các phiên bản thực hiện AES nhằm mục đích bảo vệ hệ thống an ninh hay thông tin quốc gia phải được NSA kiểm tra và chứng nhận trước khi sử dụng"
Tấn công kênh bên (Side channel attacks): Tấn công kênh bên không tấn công trực tiếp vào thuật toán mã hóa mà thay vào đó, tấn công lên các hệ thống thực hiện thuật toán có sơ hở làm lộ dữ liệu. Tháng 4 năm 2005, Daniel J. Bernstein công bố một tấn công lên hệ thống mã hóa AES trong OpenSSL. Một máy chủ được thiết kế để đưa ra tối đa thông tin về thời gian có thể thu được và cuộc tấn công cần tới 200 triệu plaintexts lựa chọn. Một số người cho rằng tấn công không thể thực hiện được trên Internet với khoảng cách vài điểm mạng. Tháng 10 năm 2005, Adi Shamir và 2 nhà nghiên cứu khác có một bài nghiên cứu minh họa một vài dạng khác. Trong đó, một tấn công có thể lấy được khóa AES với 800 lần ghi trong 65 mili giây. Tấn công này yêu cầu kẻ tấn công có khả năng chạy chương trình trên chính hệ thống thực hiện mã hóa.
*** Phương pháp mã hóa AES đơn giản, có thể thực hiện hiệu quả trên các vi xử lý 8 bit (dùng trong smartcard) cũng như trên các vi xử lý 32 bit, chỉ dùng phép XOR và phép Shift bit. Đây chính là yếu tố cơ bản để phương pháp này được chọn làm chuẩn mã hóa của Hoa Kỳ.