Thứ Tư, 23 tháng 10, 2019

[AES] Bài 6 - Các chế độ mã hóa và giải mã

Bài viết này trình bày về một số chế độ mã hóa trong mã hóa khối (Block Cipher Mode). Đây là các chế độ đã được chuẩn hóa để sử dụng với các thuật toán mã hóa khối dùng khóa mã đối xứng như DES (Data Encryption Standard), Triple-DES (TDEA), AES (Advanced Encryption Standard), IDE (International Data Encryption), RC5, RC6 (Rivest Cipher), Blowfish, …
Các chế độ mã hóa được trình bày trong bài viết này sẽ là các đặc điểm chức năng được hỗ trợ bởi lõi IP AES128 sẽ được tác giả mô tả trong các bài viết tiếp theo.
Danh sách các bài viết trước:
Bài 5 - Tối ưu logic tính S-Box dựa trên biến đổi toán học
Bài 4 - Thiết kế bộ giải mã AES-128
Bài 3 - Thiết kế bộ mã hóa AES-128
Bài 2 - Lý thuyết về giải mã AES-128
Bài 1 - Lý thuyết về mã hóa AES-128
1) Tổng quan 
Các thuật toán mã hóa như mã hóa khối (block cipher algorithm) cung cấp cơ chế chuyển đổi thuận nghịch giữa giá trị thực được dùng bởi hệ thống, gọi là bản rõ (plaintext), và giá trị mã hóa, gọi là bản mã (ciphertext). 
Mã hóa khối (block cipher) là mã hóa thực thi trên từng khối bit có kích thước cố định. Ví dụ, DES mã hóa trên 64 bit dữ liệu đầu vào, AES mã hóa trên 128, 192 hoặc 256 bit dữ liệu đầu vào. Mã hóa khối khác với mã hóa dòng (stream cihper), hay còn gọi là mã hóa luồng. Mã hóa dòng xử lý trên từng bit dữ liệu đầu vào. 
Mã hóa khóa mã đối xứng (symmetric key) là thuật toán dùng khóa mã hóa và khóa giải mã có mối liên hệ với nhau, có thể dùng khóa này biến đổi thành khóa kia và ngược lại, hoặc hai khóa mã hoàn toàn giống nhau. 
Trong khi vai trò chính của một thuật toán mã hóa là sử dụng khóa mã bảo mật (secure/secret key) kết hợp với bản rõ để tạo ra bản mã, hoặc ngược lại, kết hợp với bản mã để khôi phục lại bản rõ thì vai trò của “chế độ mã hóa” là quy định cách thức sử dụng của một thuật toán mã hóa. Cùng một thuật toán mã hóa, cách thức sử dụng khác nhau sẽ tạo ra các kết quả mã hóa dữ liệu khác nhau với mức độ bảo mật khác nhau. 
Tóm lại, quá trình mã hóa dữ liệu gồm 2 phần quan trọng là: 
  • Thuật toán mã hóa (cipher algorithm) 
  • Chế độ mã hóa (cipher mode) 
Hình 1: Quá trình mã hóa là sự kết hợp giữa thuật toán mã hóa và chế độ mã hóa
2) Chú thích
Bạn đọc cần hiểu rõ các ký hiệu trong mục này để có thể đọc hiểu các biểu thức định nghĩa quá trình mã hóa và giải mã.
2.1) Các ký hiệu 
Tác giả sẽ dùng các ký hiệu sau đây trong bài viết, các ký hiệu này có thể khác các ký hiệu thường thấy trong tài liệu chuẩn nhưng ý nghĩ là tương đương.
  • Khối - ứng với từ khóa block, nó chỉ một nhóm bit có số lượng là b
  • Đoạn hoặc phân đoạn - ứng với từ khóa segment, nó chỉ một nhóm bit có số lượng là s
  • b – kích thước theo bit của một khối (block)
  • j - chỉ số của các khối hoặc đoạn (segment) dữ liệu theo thứ tự từ trái sang phải
  • n - số khối hoặc đoạn dữ liệu trong plaintext
  • s – số bit của một đoạn dữ liệu
  • u - số bit trong khối plaintext hoặc ciphertext cuối cùng
  • Cj – Khối ciphertext thứ j
  • C#j - Đoạn ciphertext thứ j
  • C*n - khối cuối cùng của ciphertext, nó có thể là khối chỉ chứa một phần dữ liệu (partial block)
  • Ij - khối ngõ vào thứ j
  • IV - Vector khởi tạo (Initialization Vector)
  • K - Khóa mã
  • Oj - Khối ngõ ra thứ j
  • Pj - Khối plaintext thứ j
  • P#j - Đoạn plaintext thứ j
  • P*n - Khối cuối cùng của plaintext, nó có thể là khối chỉ chứa một phần dữ liệu.
  • Tj - Khối bộ đếm thứ j
2.2) Các chức năng
  • X|Y - Nối hai chuỗi bit X và Y
  • X+Y - XOR hai chuỗi bit có cùng độ dài X và Y
  • CIPTHk(X) – Chức năng mã hóa (mã hóa thuận) của một thuật toán mã hóa khối với khóa mã K áp dụng trên khối dữ liệu X. 
  • CIPTHINVk(X) – Chức năng giải mã (mã hóa nghịch) của một thuật toán mã hóa khối với khóa mã K áp dụng trên khối dữ liệu X. 
  • LSBm(X) - Chức năng lấy m bit LSB của chuỗi bit X
  • MSBm(X) - Chức năng lấy m bit MSB của chuỗi bit X
  • [x]m - Biểu diễn binary của một số nguyên không âm x trong m bit với x < 2^m
3) ECB (Electronic Codebook) 
ECB là chế độ mã hóa từng khối bit độc lập. Với cùng một khóa mã K, mỗi khối plaintext ứng với một giá trị ciphertext cố định và ngược lại.
Hình 2: Chế độ mã hóa/giải mã ECB
3.1) Quá trình mã hóa ECB 
Biểu thức định nghĩa:
Cj = CIPTHk(Pj) với j=1, 2, 3, …, n 
Plaintext là đầu vào trực tiếp để thực thi thuật toán mã hóa với khóa mã K để tạo ra ciphertext.
3.2) Quá trình giải mã ECB
Biểu thức định nghĩa:
Pj = CIPTHINVk(Cj) với j=1, 2, 3, …, n 
Ciphertext là đầu vào trực tiếp để thực thi thuật toán giải mã với khóa mã K để tạo ra plaintext.
3.3) Nhận xét
Ưu điểm: 
  • Thiết kế phần cứng đơn giản. Vấn đề cần quan tâm chính là thiết kế logic cho thuật toán mã hóa. 
  • Lỗi bit không bị lan truyền. Nếu lỗi bit xuất hiện trên một ciphertext của một khối dữ liệu thì nó chỉ ảnh hưởng đến việc giải mã khối dữ liệu đó chứ không ảnh hưởng đến việc giải mã khác khối dữ liệu khác.
  • Có thể thực hiện mã hóa/giải mã song song (parallel) nhiều khối dữ liệu cùng lúc. Điều này giúp tăng tốc độ xử lý trong các hệ thống đòi hỏi mã hóa/giải mã tốc độ cao. 
Nhược điểm:
  • Khả năng bảo mật kém. Do giá trị plaintext và ciphertext được ánh xạ độc lập một-một nên thông tin mã hóa dễ bị sửa đổi bằng cách như xóa bớt khối dữ liệu, chèn thêm khối dữ liệu, hoán đổi vị trí khối dữ liệu để làm sai lệch thông tin tại nơi nhận.
4) CBC (Cipher Block Chaining) 
CBC là chế độ mã hóa chuỗi, kết quả mã hóa của khối dữ liệu trước (ciphertext) sẽ được tổ hợp với khối dữ liệu kế tiếp (plaintext) trước khi thực thi mã hóa. 
Hình 3: Chế độ mã hóa/giải mã CBC
4.1) Quá trình mã hóa CBC
Biểu thức định nghĩa:
C1 = CIPHk(P1+IV) 
Cj = CIPHk(Pj+Cj-1) với j=2, 3, …, n 
Lần mã hóa đầu tiên: 
  • Plaintext XOR với vector khởi tạo IV 
  • Kết quả bước trên là đầu vào cho việc thực thi thuật toán mã hóa với khóa mã
Lần mã hóa sau lần đầu tiên: 
  • Plaintext XOR với ciphertext của lần mã hóa trước đó. 
  • Kết quả bước trên là đầu vào cho việc thực thi thuật toán mã hóa với khóa mã
4.2) Quá trình giải mã CBC
Biểu thức định nghĩa:
P1 = CIPHINVk(C1)+IV 
Pj = CIPHk(Cj)+Cj-1 với j=2, 3, …, n 
Lần giải mã đầu tiên:
  • Ciphertext được thực thi quá trình giải mã với khóa mã K
  • Kết quả bước trên được XOR với vector khởi tạo IV để tạo ra plaintext
Lần giải mã sau lần đầu tiên:
  • Ciphertext được thực thi quá trình giải mã với khóa mã K
  • Kết quả bước trên được XOR với ciphertext sử dụng trong lần giải mã trước để tạo ra plaintext
4.3) Nhận xét

Ưu điểm:
  • Khả năng bảo mật cao hơn ECB. Ciphertext của một khối dữ liệu plaintext có thể khác nhau cho mỗi lần mã hóa vì nó phụ thuộc vào IV hoặc giá trị mã hóa (ciphertext) của khối dữ liệu liền trước. 
  • Quá trình giải mã (mã hóa nghịch) vẫn có thể thực hiện song song nhiều khối dữ liệu.
Nhược điểm: 
  • Thiết kế phần cứng phức tạp hơn ECB ngoài logic thực thi thuật toán mã hóa, người thiết kế cần thiết kế thêm:
    • Logic quản lý độ dài chuỗi dữ liệu sẽ được mã hóa, cụ thể là số lượng khối dữ liệu trong chuỗi dữ liệu.
    • Bộ tạo giá trị ngẫu nhiên cho IV
  • Lỗi bit bị lan truyền. Nếu một lỗi bit xuất hiện trên ciphertext của một khối dữ liệu thì nó sẽ làm sai kết quả giải mã của khối đữ liệu đó và khối dữ liệu tiếp theo. 
  • Không thể thực thi quá trình mã hóa song song vì xử lý của khối dữ liệu sau phụ thuộc vào ciphertext của khối dữ liệu trước, trừ lần mã hóa đầu tiên.
5) CFB (Cipher Feedback) 
CFB là chế độ mã hóa mà ciphertext của lần mã hóa hiện tại sẽ được phản hồi (feedback) đến đầu vào của lần mã hóa tiếp theo. Nghĩa là, ciphertext của lần mã hóa hiện tại sẽ được sử dụng để tính toán ciphertext của lần mã hóa kế tiếp. Mô tả có vẻ giống CBC nhưng quá trình trực hiện lại khác.
Hình 4: Chế độ mã hóa/giải mã CFB
5.1) Quá trình mã hóa CFB
Biểu thức định nghĩa:
I1 = IV
Ij = LSBb-s(Ij-1) | C#j-1  với j=2, 3, ..., n
Oj = CIPHk(Ij)                 với j=1, 2, ..., n
C#j = P#j + MSBs(Oj)      với j=1, 2, ..., n
Lần mã hóa đầu tiên:
  • Khối dữ liệu ngõ vào của quá trình mã hóa lấy từ IV, ứng với biểu thức I1,
  • Vector khởi tạo IV được mã hóa để tạo ra một khối giá trị chứa b bit, ứng với biểu thức Oj
  • s bit MSB của kết quả trên sẽ được dùng để XOR với s bit dữ liệu (plaintext) để tạo ra s bit ciphertext, ứng với biểu thức C#j
IV là giá trị không cần bảo mật nhưng phải là giá trị không thể dự đoán trước được. IV có độ dài là b bit, bằng độ dài của một khối dữ liệu mà chuẩn mã hóa quy định. 
s là một số nguyên và 1 ≤ s ≤ b, đây chính là độ dài plaintext và ciphertext cho một lần mã hóa/giải mã. Giá trị của s có thể được tích hợp vào tên gọi của chế độ CFB để chỉ rõ chế độ số lượng bit được hỗ trợ. Ví dụ: 
  • 1-bit CFB – Mỗi lần thực hiện mã hóa/giải mã 1 bit 
  • 8-bit CFB – Mỗi lần thực hiện mã hóa/giải mã 8 bit 
  • 64-bit CFB – Mỗi lần thực hiện mã hóa/giải mã 64 bit
Lần mã hóa sau lần đầu tiên:
  • Khối dữ liệu ngõ vào của quá trình mã hóa được ghép giã b-s bit LSB của khối ngõ vào của lần mã hóa trước đó và s bit của ciphertext của lần mã hóa trước đó, ứng với biểu thức Ij,
  • Giá trị của bước trên được mã hóa để tạo ra một khối giá trị chứa b bit, ứng với biểu thức Oj
  • s bit MSB của kết quả trên sẽ được dùng để XOR với s bit dữ liệu (plaintext) để tạo ra s bit ciphertext, ứng với biểu thức C#j
5.3) Nhận xét
So sánh với chế độ CBC, chế độ CFB có những điểm khác biệt sau đây:
  • Thuật toán mã hóa không áp dụng trực tiếp trên plaintext mà dùng để biển đổi một khối dữ liệu sinh ra từ IV và ciphertext
  • Số lượng bit dữ liệu được mã hóa, giải mã có thể nhỏ hơn hoặc bằng số lượng bit mà thuật toán mã hóa hỗ trợ, 1 ≤ s ≤ b
Ưu điểm:
  • Khả năng bảo mật cao hơn ECB. Ciphertext của một khối dữ liệu plaintext có thể khác nhau cho mỗi lần mã hóa vì nó phụ thuộc vào IV hoặc giá trị mã hóa (ciphertext) của khối dữ liệu liền trước. 
  • Quá trình giải mã (mã hóa nghịch) vẫn có thể thực hiện song song nhiều khối dữ liệu.
  • Tùy biến được độ dài khối dữ liệu mã hóa, giải mã thông qua thông số s
Nhược điểm:
  • Thiết kế phần cứng phức tạp hơn CBC. Ngoài những thành phần logic như CBC, CFB cần thêm logic để chọn số bit cần được xử lý nếu s là thông số cấu hình được.
  • Lỗi bit bị lan truyền. Nếu một lỗi bit xuất hiện trên ciphertext của một khối dữ liệu thì nó sẽ làm sai kết quả giải mã của khối đữ liệu đó và khối dữ liệu tiếp theo. 
  • Không thể thực thi quá trình mã hóa song song vì xử lý của khối dữ liệu sau phụ thuộc vào ciphertext của khối dữ liệu trước, trừ lần mã hóa đầu tiên
6) OFB (Output Feedback)
OFB là chế độ mã hóa mà giá trị ngõ ra của khối thực thi thuật toán mã hóa, không phải ciphertext, của lần mã hóa hiện tại sẽ được phản hồi (feedback) đến ngõ vào của lần mã hóa kế tiếp.
Hình 5: Chế độ mã hóa, giải mã OFB
6.1) Quá trình mã hóa OFB
Biểu thức định nghĩa:
I1 = IV 
Ij = Oj-1                            với j = 2, 3, ..., n
Oj = CIPHk(Ij)                 với j = 1, 2, ..., n
Cj = Pj + Oj                      với j = 1, 2, ..., n-1
C*n = P*n + MSBu(On) 
Lần mã hóa đầu tiên:
  • Giá trị IV được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức I1
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR plaintext và kết quả của bước trên, ứng với biểu thức Cj
Lần mã hóa sau lần đầu tiên và trước lần cuối cùng:
  • Giá trị của khối ngõ ra (output block) trước đó được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức Ij
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR plaintext và kết quả của bước trên, ứng với biểu thức Cj
Lần mã hóa cuối cùng (thứ n):
  • Giá trị của khối ngõ ra (output block) trước đó được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức Ij
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR plaintext và với các bit MSB của kết quả của bước trên theo độ dài của plaintext (độ dài plaintext của lần cuối cùng có thể ngắn hơn độ dài của khối ngõ ra), ứng với biểu thức C*n
6.2) Quá trình giải mã OFB
Biểu thức định nghĩa:
I1 = IV 
Ij = Oj-1                            với j = 2, 3, ..., n
Oj = CIPHk(Ij)                 với j = 1, 2, ..., n
Pj = Cj + Oj                      với j = 1, 2, ..., n-1
P*n = C*n + MSBu(On) 
Lần giải mã đầu tiên:
  • Giá trị IV được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức I1
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR ciphertext và kết quả của bước trên, ứng với biểu thức Pj
Lần giải mã sau lần đầu tiên và trước lần cuối cùng:
  • Giá trị của khối ngõ ra (output block) trước đó được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức Ij
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR ciphertext và kết quả của bước trên, ứng với biểu thức Pj
Lần giải mã cuối cùng (thứ n):
  • Giá trị của khối ngõ ra (output block) trước đó được lấy làm khối giá trị đầu vào mã hóa, ứng với biểu thức Ij
  • Thực thi giải thuật mã hóa cho khối trên với khóa mã K, ứng với biểu thức Oj
  • XOR ciphertext và với các bit MSB của kết quả của bước trên theo độ dài của ciphertext (độ dài ciphertext của lần cuối cùng có thể ngắn hơn độ dài của khối ngõ ra), ứng với biểu thức P*n
6.3) Nhận xét
Chế độ OFB có những đặc điểm cần chú ý như sau:
  • Thuật toán mã hóa không áp dụng trực tiếp trên plaintext mà dùng để biển đổi một khối dữ liệu sinh ra từ IV và khối ngõ ra của lần mã hóa trước đó. Điểm này tương tự với CFB.
  • OFB khác với CFB là nó xử lý trên một khối dữ liệu với độ dài bit đầy đủ như thuật toán mã hóa quy định chứ không xử lý trên một phần hay một vài bit của khối dữ liệu.
Ưu điểm:
  • Khả năng bảo mật cao hơn ECB. Ciphertext của một khối dữ liệu plaintext có thể khác nhau cho mỗi lần mã hóa vì nó phụ thuộc vào IV hoặc khối ngõ ra của lần mã hóa trước đó.
  • Lỗi bit không bị lan truyền. Khi một lỗi bit xuất hiện trên một ciphertext, nó chỉ ảnh hưởng đến kết quả giải mã của khối dữ liệu hiện tại
  • Thiết kế phần cứng đơn giản hơn CFB.
Nhược điểm:
  • Không thể thực hiện mã hóa/giải mã song song nhiều khối dữ liệu vì lần mã hóa/giải mã sau phụ thuộc vào khối ngõ ra của lần mã hóa/giải mã liền trước nó.
7) CTR (Counter)
CTR là chế độ mã hóa sử dụng một tập các khối ngõ vào, gọi là các counter, để sinh ra một tập các giá trị ngõ ra thông qua một thuật toán mã hóa. Sau đó, giá trị ngõ ra sẽ được XOR với plaintext để tạo ra ciphertext trong quá trình mã hóa, hoặc XOR với ciphertext để tạo ra plaintext trong quá trình giải mã.
Hình 6: Chế độ mã hóa, giải mã CTR
7.1) Quá trình mã hóa
Biểu thức định nghĩa:
Oj = CIPHk(Tj)    với j = 1, 2, ..., nCj = Pj + Oj          với j = 1, 2, ..., n-1C*n = P*n + MSBu(On)
  • Giá trị của khối ngõ ra (output block) được tạo từ giá trị của khối bộ đếm thứ j bằng cách thực thi giải thuật mã hóa với khóa K, ứng với biểu thức Oj.
  • Giá trị trên được XOR với plaintext thứ j để tạo ra ciphertext thứ j, ứng với biểu thức Cj.
  • Đối với khối dữ liệu cuối cùng của chuỗi dữ liệu, khối thứ n, nếu độ dài bit của plaintext ít hơn độ dài bit được quy định bởi chuẩn mã hóa thì chỉ lấy các bit trọng số cao của khối ngõ ra (output block) XOR với plaintext, ứng với biểu thức C*n.
7.2) Quá trình giải mã
Biểu thức định nghĩa:
Oj = CIPHk(Tj)    với j = 1, 2, ..., n 
Pj = Cj + Oj           với j = 1, 2, ..., n-1 
P*n = C*n + MSBu(On)
  • Giá trị của khối ngõ ra (output block) được tạo từ giá trị của khối bộ đếm thứ j bằng cách thực thi giải thuật mã hóa với khóa K, ứng với biểu thức Oj.
  • Giá trị trên được XOR với ciphertext thứ j để tạo ra plaintext thứ j, ứng với biểu thức Cj.
  • Đối với khối dữ liệu cuối cùng của chuỗi dữ liệu, khối thứ n, nếu độ dài bit của ciphertext ít hơn độ dài bit được quy định bởi chuẩn mã hóa thì chỉ lấy các bit trọng số cao của khối ngõ ra (output block) XOR với ciphertext, ứng với biểu thức P*n.
7.3) Nhận xét
Chế độ CTR có những đặc điểm cần chú ý như sau:
  • Thuật toán mã hóa không áp dụng trực tiếp trên plaintext mà dùng để biển đổi một khối dữ liệu sinh ra từ các bộ đếm (counter).
  • Quá trình mã hóa/giải mã của mỗi khối dữ liệu là độc lập.
Ưu điểm:
  • Khả năng bảo mật cao hơn ECB. Tuy quá trình mã hóa/giải mã của mỗi khối dữ liệu là độc lập nhưng mỗi plaintext có thể ảnh xạ đến nhiều ciphertext tùy vào giá trị bộ đếm của các lần mã hóa. 
  • Có thể mã hóa/giải mã song song nhiều khối dữ liệu.
Nhược điểm:
  • Phần cứng cần thiết kế thêm các bộ đếm counter hoặc giải thuật tạo các giá trị counter không lặp lại. 

Tài liệu tham khảo:
1) Morris DworkinRecommendation for Block Cipher Modes of Operation - Methods and TechniquesNIST Special Publication 800-38A; 2001 Edition

Lịch sử cập nhật:
1) 2019.10.23 - Tạo lần đầu
2) 2020.09.15 - Xóa câu nhận xét về CTR, lỗi copy

2 bình luận:

  1. Anh Quân và nhóm cho em hỏi chỗ nhược điểm của CTR (7.3).
    "Không thể thực hiện mã hóa/giải mã song song nhiều khối dữ liệu vì lần mã hóa/giải mã sau phụ thuộc vào khối ngõ ra của lần mã hóa/giải mã liền trước nó."

    Câu này có gì đó sai sai :)

    Trả lờiXóa
    Trả lời
    1. Không phải có gì đó sai sai mà là sai bét, anh đã cập nhật.
      Không ngờ cũng có bạn đọc :)
      Thank em.

      Xóa