Hàm dẫn xuất khóa - một thành phần quan trọng của mật mã ứng dụng

15:02 | 06/04/2010

Trong ứng dụng của mật mã, có những trường hợp thông báo cần mã hóa có độ dài rất lớn, chẳng hạn một bức ảnh hoặc hình ảnh của một cuộc truyền hình hội nghị. Khi đó người ta thường có xu hướng thay đổi khóa để mã hóa nhiều lần một cách tự động. Và đó cũng là một trong những lúc cần đến các hàm dẫn xuất khóa.

Hàm dẫn xuất khóa (KDF) là thành phần cơ bản và cần thiết của các hệ thống mật mã. Mục tiêu của  nó là từ nguồn tư liệu khóa ban đầu nào đó (thông thường chứa một độ ngẫu nhiên nhất định nào đó, nhưng không có phân bố đều hoặc kẻ tấn công có một phần tri thức về nguồn dữ liệu đó) điều chế thành một hoặc nhiều khóa mật mã mạnh.
Số lượng và độ dài của các khóa mật mã phụ thuộc vào các thuật toán mật mã cụ thể cần đến những khóa đó. Nhìn chung các hàm dẫn xuất khóa phải đáp ứng được mọi mức độ về số lượng và độ dài nói trên. Thuật ngữ “khóa mật mã mạnh” được đề cập ở đây ngụ ý là các khóa giả ngẫu nhiên mà người ta không thể phân biệt được với một xâu các ký tự ngẫu nhiên phân bố đều, có độ dài được xác định bởi sức mạnh tính toán trên thực tế. Đặc biệt, các hàm dẫn xuất khóa phải bảo đảm rằng tri thức về một phần các bit hoặc khóa từ đầu ra của hàm KDF không làm lộ thông tin về các bit khác được sinh ra.
Các ví dụ điển hình về tư liệu khóa ban đầu là các giá trị Diffie - Hellman được tính toán trong  giao thức trao đổi khóa, một dãy bit thu được bởi lấy mẫu thống kê (như lấy mẫu các sự kiện hệ thống hoặc các phím gõ của người dùng), đầu ra của bộ sinh số ngẫu nhiên vật lý không hoàn hảo....
Cho đến nay, hầu hết các thiết kế KDF trong thực tế  (người ta hay gọi loại KDF này là lược đồ truyền thống) có thể được mô tả như sau:
KM = Hash(SKM ll”1” llinfo) ll Hash (SKM ll ”2” llinfo) ll... ll Hash(SKM ll ”t” llinfo)
Hoặc
KM = PRF(SKM ll”1” llinfo) ll PRF(SKM ll”2” llinfo) ll... ll PRF(SKM ll”t” llinfo)
Trong đó, SKM ký hiệu nguồn tư liệu khóa (hay là tư liệu khóa ban đầu), ll chỉ phép nối và info (tùy chọn) là thông tin ngữ cảnh và ứng dụng đặc biệt. PRF(K,.) chỉ hàm giả ngẫu nhiên bị khóa bởi khóa K. Giá trị t phụ thuộc vào tư liệu khóa KM do ứng dụng yêu cầu. Ở đây, Hash thường được thực hiện bởi hàm hash rõ như SHA-1.
Đến nay, các lược đồ truyền thống đã được nghiên cứu và ứng dụng tương đối nhiều. Về ứng dụng, điển hình là mô tả trong tài liệu SP 800-108 Recommendation For Key Derivation Using Pseudorandom Function của Viện Tiêu chuẩn quốc gia Mỹ (NIST).
Những năm gần đây, một cấu trúc mới của KDF đã được đề xuất, trong đó hai giai đoạn tương ứng với hai môđun trích và mở rộng được tách bạch rõ ràng, có thể mô tả như sau:
K = Hash(SKM);
KM = PRF(K,”1”llinfo) ll PRF(K,”2”llinfo) ll... ll PRF(K,”t”llinfo);
Lược đồ mới này được gọi tắt là  lược đồ XtX (trích -  rồi -  mở rộng)
Khi tư liệu khóa ban đầu (SKM) có tính chất ngẫu nhiên như khóa K ngẫu nhiên đều hoặc giả ngẫu nhiên thì người ta có thể sử dụng SKM làm khóa K cho hàm giả ngẫu nhiên (PRF) để tạo ra nhiều khóa mật mã khác. Tuy nhiên, khi tư liệu khóa ban đầu không ngẫu nhiên phân bố đều hoặc không giả ngẫu nhiên thì trước hết KDF cần "trích" từ tư liệu khóa không hoàn hảo này một khóa giả ngẫu nhiên rồi từ đó các khóa tiếp theo có thể được dẫn xuất nhờ sử dụng một PRF (hàm giả ngẫu nhiên). Như vậy, có thể có hai môđun logic trong một KDF: môđun đầu tiên lấy tư liệu khóa ban đầu và trích ra một khóa K giả ngẫu nhiên có độ dài cố định, môđun thứ hai sẽ mở rộng khóa K thành một số khóa mật mã giả ngẫu nhiên nữa.
Cả hai lược đồ đều xử lý giá trị SKM (có entropy ở một mức độ nào đó) bằng hàm Hash để tập trung entropy vào các bit ra, nhưng điểm khác biệt chính giữa hai loại lược đồ này là ở cách áp dụng hàm Hash. Trong lược đồ truyền thống cũ, hàm Hash được dùng lặp lại để trích nhiều bit ra còn trong XtX hàm Hash được dùng một lần để trích một số rất ít các bit (để tạo ra khóa đơn K). Điều này tạo ra ưu thế ban đầu về độ an toàn cho lược đồ XtX so với lược đồ truyền thống. Tuy nhiên, lược đồ XtX cũng cần sinh ra nhiều bit như lược đồ truyền thống. Điều làm cho lược đồ XtX vẫn giữ được ưu thế chính là việc dùng lặp lại PRF. PRF đã được thiết kế và phân tích để làm chính xác cái việc: nhận một khóa đơn tốt và sinh ra nhiều bit giả ngẫu nhiên. Cần chú ý rằng trong lược đồ truyền thống cũ (so với SP 800-108 Recommendation For Key Derivation Using Pseudorandom Function), hàm Hash rõ được áp dụng lặp đi lặp lại vào các giá trị chỉ khác biệt rất ít bởi giá trị đếm. Nghĩa là các đầu vào của hàm Hash tuy khác nhau nhưng có tương quan  cao. Trong lược đồ XtX, hàm PRF  được áp dụng lặp đi lặp lại vào các giá trị chỉ khác biệt rất ít như thế, nhưng PRF được thiết kế để duy trì an toàn ngay cả khi các đầu vào (trừ khóa mã) đã được biết hết và có tương quan, hoặc thậm chí do đối phương lựa chọn. Ngay cả đối với lược đồ mô tả trong SP 800-108, sau khi đã có cải tiến lược đồ truyền thống bằng cách thay hàm Hash bằng PRF thì lược đồ XtX dạng sau đây vẫn có thêm một ưu thế nữa là khóa K đã được làm mạnh hơn từ SKM nhờ “bộ trích tính ngẫu nhiên” XTR (mà ở trên ta ký hiệu chung là Hash) có “muối” XTS không bí mật:
PRK = XTR(XTS, SKM);
KM = PRF*(PRK, CTXinfo, L)
trong đó,  t = , d = L mod k và k là độ dài đầu ra của PRF,
PRF*(PRK, x, L) = K(1) ll K(2) ll... ll K(t):d
K(1) = PRF(PRK, 0:k llx ll0:32),
K(i+1) = PRF(PRK, K(i)llx lli:32), 1 i <t.
Cần nói thêm là, muối XTS được rút ra từ đại lượng ngẫu nhiên phân phối đều, tuy không cần giữ bí mật nhưng cũng làm cho khóa đơn mạnh lên rất nhiều so với SKM. Người ta chứng minh được rằng, khi đó KM là giả ngẫu nhiên.Việc nghiên cứu các hàm dẫn xuất khóa là rất quan trọng và cần thiết cho quá trình nghiên cứu, ứng dụng và cả chuẩn hóa các thành tố mật mã.