Nguyên gốc và giao diện

Tiếp theo, chúng tôi xác định (một cách không chính thức nhưng sau đó là trang trọng hơn), hai phần quan trọng của ngôn ngữ dùng trong Tink, GốcGiao diện.

Nguyên gốc

Dữ liệu nguyên gốc là một đối tượng toán học tương ứng với tất cả thuật toán thực hiện một số tác vụ một cách an toàn. Ví dụ: dữ liệu gốc AEAD bao gồm tất cả các thuật toán mã hoá đáp ứng những thuộc tính bảo mật mà Tink yêu cầu của Aead.

Chúng tôi nhấn mạnh rằng dữ liệu gốc không bị ràng buộc với một ngôn ngữ lập trình hoặc một ngôn ngữ cụ thể đường truy cập chúng. Thay vào đó, bạn nên coi dữ liệu gốc là lớp thuần tuý đối tượng toán học. Ví dụ: nếu chúng tôi xem xét AEAD, về cơ bản, bao gồm các cặp hàm, một hàm thực hiện mã hoá và một hàm thực hiện giải mã.

Giao diện

Giao diện là cách chúng ta cung cấp cho người dùng quyền truy cập vào một dữ liệu nguyên gốc. Ví dụ: chúng tôi dự kiến trong tương lai Tink sẽ cung cấp giao diện Mac, mà còn giao diện StreamingMac, cho phép tính toán mac của mà không được tải trực tiếp vào bộ nhớ.

Vui lòng lưu ý chúng ta có phân biệt rõ ràng giao diện và dữ liệu gốc ở đây. Thao tác này sẽ làm rõ rằng đối tượng toán học mà hai giao diện này cung cấp đều giống nhau.

Định nghĩa trang trọng

Đối với hầu hết độc giả, những lời giải thích trực quan ở trên có lẽ đã đủ. Tuy nhiên, đôi khi chúng tôi cũng cảm thấy cần phải cung cấp định nghĩa của các khái niệm này.

Hàm mã hoá

Khái niệm về hàm mật mã không quan trọng bằng khái niệm về hàm ban đầu, nhưng chúng ta cần đưa nó vào để chính thức định nghĩa dữ liệu nguyên thuỷ.

Hàm mật mã

Hàm mã hoá là một bản đồ

\[ f: {\bf K} \times {\bf R} \times {\bf I} \to {\bf O}\]

từ một tập hợp \({\bf K}\) (không gian khoá), một tập hợp \({\bf R} = \{0,1\}^{\infty}\) (tính ngẫu nhiên, mà chúng tôi giả định là tập hợp các chuỗi bit vô hạn) và set \({\bf I}\) (không gian đầu vào) thành tập hợp \({\bf O}\) (không gian đầu ra).

Sau này, bạn sẽ biết rõ lý do chúng ta thêm một thông số ngẫu nhiên cụ thể.

Ví dụ: chúng tôi chỉ ra một khả năng cách liên kết những khái niệm này với AES-GCM. Đối với từng kích thước khoá \(s_k\), kích thước số chỉ dùng một lần \(s_n\)và kích thước thẻ hợp lệ \(s_t\), AES-GCM bao gồm hai hàm mã hoá, một hàm dành cho mã hoá và một phương thức dành cho giải mã. Cả hai sẽ có cùng không gian phím \({\bf K} = \{0,1\}^{s_k}\).

Đối với hàm mã hoá \(\mathrm{Enc}\), bit \(s_n\) đầu tiên của ngẫu nhiên sẽ được dùng để chọn số chỉ dùng một lần.

Hãy \({\bf B} = \{0,1\}^8\) biểu thị một byte. Không gian đầu vào của hàm mã hoá là các cặp \({\bf I} = {\bf B}^{*} \times {\bf B}^{*}\) cặp chuỗi byte có độ dài tuỳ ý. Phần tử đầu tiên của cặp là phần tử chính là thông điệp, phần tử thứ hai là thông điệp dữ liệu liên quan. Tiêu chuẩn AES-GCM có giới hạn trên cho độ dài của dữ liệu đầu vào, nhưng chúng tôi muốn cho phép độ dài tuỳ ý và thay vào đó hãy thêm ký hiệu lỗi \(\bot\) vào không gian đầu ra. Không gian đầu ra sau đó sẽ trở thành \({\bf O} = {\bf B}^* \cup \{\bot\}\), trong đó chúng ta tuỳ ý xác định kết quả của các phép tính thành công dưới dạng chuỗi nối \((\mathrm{IV} \| \mathrm{ciphertext} \| \mathrm{tag})\) như đã cho trong tiêu chuẩn và kết quả đầu ra \(\bot\), trong trường hợp một số giá trị nhập quá dài. Do đó, đối với một khoá cố định, phương thức hàm mã hoá trở thành loại \(\mathrm{Enc}_k : {\bf R} \times {\bf B}^* \times {\bf B}^* \rightarrow {\bf B}^* \cup \{\bot\}\).

Đối với hàm giải mã \(\mathrm{Dec}\) , không gian khoá giống nhau. Chiến lược phát hành đĩa đơn không gian đầu vào trùng hợp là giống nhau: \({\bf I} ={\bf B}^* \times {\bf B}^*\), nhưng bây giờ phần tử đầu tiên là dữ liệu đầu ra của hàm mã hoá, trong khi dữ liệu thứ hai vẫn là dữ liệu được liên kết.

Không gian đầu ra cũng sẽ giữ nguyên \({\bf O} = {\bf B}^* \cup \{\bot\}\) (lại là một sự trùng hợp). Cách diễn giải hơi khác, như \(\bot\) thường biểu thị lỗi xác thực (mặc dù nó cũng sẽ là trong trường hợp một số dữ liệu đầu vào quá dài).

Chúng tôi nhấn mạnh rằng cách thức chính thức hoá nêu trên không phải là lựa chọn duy nhất để hợp thức hoá chuẩn. Ví dụ: người dùng có thể coi số chỉ dùng một lần là một phần của dữ liệu đầu vào, đọc dữ liệu đó từ ngẫu nhiên (dẫn đến một dữ liệu nguyên gốc rất khác). Ngoài ra, bạn có thể xác định đầu ra là bộ ba chứa số chỉ dùng một lần, bản mã và thẻ (thay vì nối). Hoặc một người có thể hạn chế không gian khoá (có thể tuỳ ý) đối với \({\bf K} = \{0,1\}^{128} \cup \{0,1\}^{256}\).

Thuật toán mã hoá:

Thuật toán mật mã (đối xứng) là một bộ dữ liệu

\[(f_1, ... f_k)\]

hàm mã hoá, trong đó tất cả các hàm đều có cùng không gian khoá. Chiến lược phát hành đĩa đơn loại của thuật toán mật mã là bộ dữ liệu \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\).

Ví dụ: đối với mỗi bộ ba \((s_k, s_n, s_t)\) khoá, số chỉ dùng một lần và thẻ hợp lệ AES-GCM\({}_{s_k, s_n, s_t}\) là một thuật toán mật mã có hai hàm \(\mathrm{Enc}\) và \(\mathrm{Dec}\) như mô tả ở trên.

Nguồn gốc và giao diện

Tiếp theo, chúng ta sẽ định nghĩa một lớp mật mã nguyên gốc.

Nguyên gốc
Tập nguyên gốc là một tập hợp các thuật toán mật mã, trong đó tất cả thuật toán có cùng loại \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\)và không gian khoá của các thuật toán bị đứt đoạn theo cặp.

Ví dụ: hãy xem xét dữ liệu gốc \(\mathrm{AEAD}\) trong Tink. Chiến dịch này có nhiều khác, trong số đó có AES-GCM cho các kích thước khoá 128 và 256 bit, không có số chỉ dùng một lần có kích thước 96 bit, AES-EAX với một số kích thước chính và XChaCha20Poly1305. Chúng có các không gian khoá rời rạc nhưng tất cả đều cung cấp cùng một hàm mã hoá \(\mathrm{Enc}\) và \(\mathrm{Dec}\). (Bằng cách nào đó, chúng tôi không thấy được mục đích thu gọn các quy mô chính khác nhau của AES-GCM trong cuộc thảo luận chính thức này, nhưng tất nhiên có thể làm được).

Xác định dữ liệu gốc

Theo cách suy nghĩ thông thường về dữ liệu gốc, trước tiên, hãy xác định các thuộc tính của phần tử gốc các hàm mã hoá rồi chỉ xem xét dữ liệu gốc là tất cả các hàm các thuật toán như vậy.

Ví dụ: đối với AEAD, chúng tôi sẽ nói rằng \(\mathrm{Dec}_k(\mathrm{Enc}_k(m, a), a) = m\) là 'luôn luôn' đã hài lòng (ngoại trừ ví dụ: nếu văn bản thuần tuý \(m\) cũng như vậy dài). Ngoài ra, chúng tôi còn có các tài sản bảo mật; ví dụ: cho một khoá ngẫu nhiên thì việc mã hoá có độ bảo mật tương đối.

Dữ liệu gốc AEAD chỉ đơn giản là tập hợp tất cả thuật toán mật mã thoả mãn các tính chất trên. Nói cách khác, trong thực tế, khi chúng ta xác định một nguyên gốc, chúng ta xác định dựa trên các thuộc tính. Chúng tôi không cung cấp danh sách như định nghĩa đã đề xuất.

Giao diện

Giao diện trong Tink cấp quyền truy cập vào một giao diện gốc, theo cách nó cho phép để tính toán một phần tử của không gian đầu ra từ không gian đầu vào. Ví dụ: hãy xem xét giao diện AEAD trong Java:

public interface Aead {
  byte[] encrypt(byte[] plaintext, byte[] associated_data) throws GeneralSecurityException;
  byte[] decrypt(byte[] ciphertext, byte[] associated_data) throws GeneralSecurityException;
}

Xin lưu ý rằng chúng tôi không cấp quyền truy cập vào dữ liệu ngẫu nhiên. Thay vào đó, chúng tôi cho phép người dùng cung cấp các phần tử của không gian đầu vào. Việc không cho phép truy cập vào mức độ ngẫu nhiên là khoá học.1

Đôi khi, Tink cung cấp nhiều giao diện cho một nguyên gốc duy nhất. Điều này có thể rất hữu ích vì các yêu cầu đôi khi khác nhau. Tuy nhiên, đang thực hiện việc này đi kèm với một mức giá: nhìn chung, càng nhiều giao diện cung cấp, thì khả năng tương tác. Ví dụ: hãy tưởng tượng một người nào đó viết thư viện dựa trên Tink và thư viện này yêu cầu người dùng chuyển vào Đối tượng Aead (để mã hoá nội bộ nội dung nào đó). Nếu Tink đề xuất quá nhiều các giao diện khác nhau \(\mathrm{AEAD}\) ở phần đầu, thì có khả năng cao là mà người dùng chưa có bản sao sẵn sàng hoạt động cho khoá mà người dùng đã chọn và thư viện cùng một lúc. Do đó, việc thêm nhiều giao diện là một sự đánh đổi.


  1. Thuật toán mật mã AEAD có thuộc tính là bảo mật chống lại các cuộc tấn công mật mã đã chọn. Điều này chỉ được đảm bảo nếu không có sử dụng lại số chỉ dùng một lần. Giao diện Aead trong Tink được thiết kế để nó ngăn chặn việc sử dụng lại số chỉ dùng một lần: người dùng không thể cung cấp số chỉ dùng một lần làm dữ liệu đầu vào để mã hoá, thay vào đó, một số chỉ dùng một lần mới sẽ được tạo ngẫu nhiên cho mỗi hoạt động mã hoá.