Mã hóa bảo toàn định dạng

16:43 | 03/09/2021

Bài viết giới thiệu về khái niệm thuật toán mã hóa có tính chất bảo toàn định dạng (Format Preserving Encryption - FPE), tức là bản mã có cùng định dạng với bản rõ, cũng như trình bày một ví dụ và quá trình chuẩn hóa kiểu thuật toán này.

GIỚI THIỆU

Trong mật mã, mã hóa bảo toàn định dạng FPE đề cập đến việc mã hóa theo cách mà đầu ra (bản mã) có cùng định dạng với đầu vào (bản rõ). Thông thường, chỉ các miền hữu hạn mới được xem xét, ví dụ:

- Để mã hóa số thẻ tín dụng gồm 16 chữ số sao cho bản mã là một số 16 chữ số khác.

- Mã hóa một từ tiếng Anh để bản mã là một từ tiếng Anh khác.

- Mã hóa một số n-bit để bản mã là một số n-bit khác (đây là định nghĩa của mã khối n-bit).

Đối với các miền hữu hạn như vậy, thì mã pháp tương đương với một hoán vị của N số nguyên {0, ..., N − 1}, trong đó N là kích thước của miền xác định.

VÌ SAO CẦN MÃ HÓA BẢO TOÀN ĐỊNH DẠNG

Nguyên nhân cần sử dụng FPE nảy sinh từ các vấn đề liên quan đến việc tích hợp mã hóa vào các ứng dụng hiện có, với các mô hình dữ liệu được xác định rõ ràng. Ví dụ điển hình là số thẻ tín dụng, chẳng hạn như 1234567812345670 (dài 16 byte, chỉ gồm có các chữ số).

Việc thêm một phép mã mật vào các ứng dụng như vậy có thể là một thách thức nếu mô hình dữ liệu sẽ thay đổi, vì nó thường liên quan đến việc thay đổi giới hạn độ dài trường hoặc kiểu dữ liệu. Ví dụ, đầu ra từ mã khối thường sẽ biến số thẻ tín dụng (một số có 16 chữ số) thành một số ở hệ thập lục phân (ví dụ, như 0x96a45cbcf9c2a9425 de9e274948cb67 gồm 32 byte) hoặc một giá trị Base64 (ví dụ như lqRcvPnCqUJc3p4nSUjLZw gồm 22 byte), điều này sẽ làm hỏng ứng dụng hiện có, vì nó đang hiển thị “số thẻ tín dụng” như một số có 16 chữ số.

Vẫn chưa hết các vấn đề rắc rối khi mã dữ liệu trong một trường của cơ sở dữ liệu. Xét ví dụ sau, giả sử dùng AES-128-CBC (thuật toán AES, khóa 128 bit và chế độ mã hóa CBC) để mã số thẻ tín dụng. Ngoài các vấn đề do tạo ra các ký tự không hợp lệ (từ các chữ số thập phân thành các chữ số thập lục phân) và làm tăng kích thước của dữ liệu, dữ liệu được mã hóa bằng chế độ CBC của thuật toán mã khối cũng thay đổi giá trị của nó khi được giải mã xong rồi mã hóa lại. Điều này xảy ra vì có một giá trị mầm ngẫu nhiên được sử dụng để khởi tạo thuật toán mã khối ở chế độ CBC, đó chính là vec-tơ khởi tạo (IV - initial vector) và nó được bao gồm như một phần của kết quả mã hóa. Nhưng giá trị này lại khác nhau đối với những lần mã hóa khác nhau. Do đó, không thể sử dụng dữ liệu đã được mã hóa bằng chế độ CBC làm khóa duy nhất để xác định một hàng trong cơ sở dữ liệu. Hay cột dữ liệu đó không thể dùng để tạo chỉ số (index) cho bảng dữ liệu được.

FPE nhằm đơn giản hóa quá trình chuyển đổi bằng cách giữ nguyên định dạng và độ dài của dữ liệu gốc, cho phép thay thế các giá trị bản rõ bằng các bản mã của chúng trong các ứng dụng đã có từ trước.

SO SÁNH VỚI HOÁN VỊ THỰC SỰ NGẪU NHIÊN

Mặc dù một hoán vị thực sự ngẫu nhiên là một mã pháp mật FPE lý tưởng, đối với các miền lớn, việc tạo trước và ghi nhớ một hoán vị thực sự ngẫu nhiên là không thể. Vì vậy, bài toán của FPE là tạo ra một hoán vị giả ngẫu nhiên từ một khóa bí mật, theo cách mà thời gian tính toán cho một giá trị duy nhất là nhỏ (một cách lý tưởng là không đổi, nhưng quan trọng nhất là nhỏ hơn so với N).

SO SÁNH VỚI CÁC MÃ KHỐI

Về mặt kỹ thuật, một mã khối n-bit là một FPE trên tập {0, ..., 2n - 1}. Nếu cần FPE trên một trong các tập có kích thước tiêu chuẩn này (ví dụ, với n = 64 hay và n = 128) thì có thể chọn sử dụng một mã khối có kích thước phù hợp (DES cho n = 64 và AES cho n = 128) và chúng ta nhận được một FPE. Tuy nhiên, trong cách sử dụng thông thường, mã khối được sử dụng trong một chế độ hoạt động nào đó (ví dụ như CBC, OFB, CFB,...), mà cho phép nó mã hóa các thông điệp dài tùy ý và với một vec-tơ khởi tạo. Khi hoạt động trong các chế độ này, mã khối không phải là mã hóa bảo toàn định dạng.

ĐỘ AN TOÀN CỦA FPE

Thế nào là một “FPE an toàn”? Người ta quan niệm một FPE tốt là một hoán vị mà “kẻ tấn công” không thể phân biệt được nó với một hoán vị thực sự ngẫu nhiên. Đây là một cách rất thông dụng mà những người làm mật mã thường dùng để định nghĩa độ an toàn của một nguyên thủy mật mã nào đó, bằng tiếng Anh là “indistinguishability”. Còn nếu như người ta có thể xây dựng được một bộ phân biệt (distinguisher) mà phân biệt được nó với một hoán vị ngẫu nhiên thực sự, thì đó không phải là một FPE an toàn. Trong khái niệm về độ an toàn của FPE đã trình bày ở trên, có đề cập tới “kẻ tấn công”. Có nhiều kiểu kẻ tấn công khác nhau có thể được xét đến, tùy thuộc vào năng lực của nó. Kẻ tấn công có thể có các bản rõ đã biết, hoặc bản rõ lựa chọn. Kẻ tấn công có thể có thêm quyền truy cập vào bộ tiên tri (oracle) nào đó.

MỘT VÍ DỤ VỀ FPE

FPE lần đầu tiên được đề cập tới trong một bài báo của các nhà mật mã học John Black và Phillip Rogaway [1]. Trong bài báo này, các tác giả đã mô tả 3 cách để thực hiện một FPE. Quan trọng là họ đã chứng minh được mỗi cách này cũng an toàn như mật mã khối được sử dụng để xây dựng nó. Điều này có nghĩa là nếu thuật toán AES được sử dụng để tạo thuật toán FPE, thì thuật toán FPE thu được cũng an toàn như AES vì kẻ thù có khả năng tấn công thuật toán FPE cũng có thể tấn công thuật toán AES. Do đó, nếu AES là an toàn, thì các thuật toán FPE được xây dựng từ nó cũng an toàn. Dưới đây, E ký hiệu phép toán mã hóa AES được sử dụng để xây dựng thuật toán FPE và F ký hiệu phép toán mã hóa FPE. AES được lấy ra làm ví dụ, nó hoàn toàn có thể được thay bằng một mã khối an toàn khác. Sau đây sẽ trình bày cách xây dựng một FPE từ một mật mã tiếp đầu ngữ (prefix cipher).

Một cách đơn giản để tạo thuật toán FPE trên {0, ..., N-1} là gán cho mỗi số một trọng số, sau đó sắp xếp lại chúng theo các trọng số nhận được. Các trọng số được xác định bằng cách áp dụng một mã khối hiện có cho mỗi số nguyên. Black và Rogaway gọi kỹ thuật này là “mật mã tiếp đầu ngữ” và cho thấy nó có thể tốt như mã khối được sử dụng. Ví dụ, để tạo FPE trên miền {0, 1, 2, 3}, khi đã cho một khóa K, hãy áp dụng EK(×) vào mỗi số nguyên, ví dụ:

 

weight(0) = 0x56c644080098fc5570f2b329323dbf62

weight(1) = 0x08ee98c0d05e3dad3eb3d6236f23e7b7

weight(2) = 0x47d2e1bf72264fa01fb274465e56ba20

weight(3) = 0x077de40941c93774857961a8a772650d


Do weight(3) < weight(1) < weight(2) < weight(0) nên việc sắp xếp lại theo các trọng số đem lại kết quả [3, 1, 2, 0]. Cho nên mã FPE thu được là:

F(0) = 3, F(1) = 1, F(2) = 2, F(3) = 0

Phương pháp này chỉ hữu ích cho các giá trị nhỏ của N. Đối với các giá trị lớn hơn, kích thước của bảng tra cứu và số lượng phép mã cần thiết để khởi tạo bảng trở nên quá lớn để thực hành.

PHÊ DUYỆT CÁC THUẬT TOÁN FPE BỞI CÁC CƠ QUAN TIÊU CHUẨN

Năm 2016, NIST đã phê chuẩn 2 thuật toán FPE trong SP 800-38G. Tuy nhiên, tài liệu này hiện đang được sửa chữa. Dự thảo NIST Special Publication 800-38G Rev 1 “Khuyến nghị về các chế độ hoạt động của mật mã khối - Các phương pháp mã hóa bảo toàn định dạng” [2] đưa ra hai phương pháp là FF1 và FF3-1.

- FF1 là FFX[Radix] “Chế độ mã hóa dựa trên Feistel bảo toàn định dạng”, nó cũng trong quá trình chuẩn hóa của ANSI X9. Nó được đệ trình lên NIST bởi Mihir Bellare, Phillip Rogaway và Terence Spies. Các phần của nó được đăng ký bản quyền. Kích thước miền xác định tối thiểu của dữ liệu được mã hóa được yêu cầu là 1 triệu.

- FF3-1 thay thế cho FF3 đã được đề xuất trước đây trong SP 800-38G. Nó được gọi tên là BPS theo các tác giả của nó là Eric Brier, Thomas Peyrin và Jacques Stern. Kích thước miền xác định tối thiểu của dữ liệu được mã hóa được yêu cầu là 1 triệu.

Hàn Quốc cũng đã phê duyệt chuẩn FPE gồm có FEA-1 và FEA-2.

TÀI LIỆU THAM KHẢO

1. John Black and Philip Rogaway, Ciphers with Arbitrary Finite Domains, Proceedings RSA-CT, 2002, pp. 114–130.

2. SP 800-38G Rev. 1 (DRAFT) Recommendation for Block Cipher Modes of Operation: Methods for Format-Preserving Encryption.