プリミティブとインターフェース

次に、(非公式に、より正式に)2 つの重要な Tink、PrimitiveInterface で使用されている言語

基本ロール

プリミティブは、すべてのアルゴリズムに対応する数学的オブジェクト 安全に実行できます。たとえば、AEAD プリミティブはすべての Tink が要求するセキュリティ特性を満たす暗号化アルゴリズム Aead の 1 つです。

プリミティブは、プログラミング言語や特定のソフトウェアに あります。プリミティブとは単に 使用できます。たとえば、AEAD を考慮すると、基本的には 暗号化を実行する関数と、暗号化を実行する関数、 復号を実行します。

インターフェース

インターフェースとは、ユーザーがプリミティブにアクセスできるようにするための方法です。 たとえば、Tink は将来的に Mac インターフェースを提供する予定です。 さらに StreamingMac インターフェースも存在し、このインターフェースでは メモリに直接読み込まれていないデータです

ここではインターフェースとプリミティブを明示的に区別しています。これにより、 この 2 つのインターフェースが与える数学的オブジェクトが アクセス権は同じです。

正式な定義

ほとんどの読者は、上記の直感的な説明で十分でしょう。 それでも、ときには正式な 学びました。

暗号関数

暗号関数の概念は、暗号技術の概念ほど重要ではない ただし、プリミティブを正式に定義するには導入する必要があります。

暗号関数

暗号関数

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

集合 \({\bf K}\) (キースペース)、集合 \({\bf R} = \{0,1\}^{\infty}\) (ランダム性、つまり無限のビット文字列の集合と想定) set \({\bf I}\) (入力空間)を set \({\bf O}\) (出力空間)に設定します。

特定のランダム性パラメータを追加した理由は、後で明らかになります。

例として、これらのコンセプトをマッピングする方法の 1 つを示します。 AES-GCM有効なキーサイズ \(s_k\)、ノンスサイズ \(s_n\)、タグサイズごとに、 \(s_t\): AES-GCM は、2 つの暗号関数で構成されています。 1 つは暗号化用でもう 1 つは復号用ですどちらも同じキースペース \({\bf K} = \{0,1\}^{s_k}\)を持ちます。

暗号化関数 \(\mathrm{Enc}\)の場合、最初の \(s_n\) ビットは ノンスの選択にランダム性が使用されます。

\({\bf B} = \{0,1\}^8\) はバイトを表します。 暗号化関数の入力空間は、任意の長さのバイト文字列のペア \({\bf I} = {\bf B}^{*} \times {\bf B}^{*}\) です。 ペアの最初の要素はメッセージであり、2 つ目の要素はメッセージです。 関連付けられていますAES-GCM 標準では、長さに上限があります。 任意の長さを許容し、代わりに特別な長さの エラー記号 \(\bot\) を出力スペースに追加します。出力空間は \({\bf O} = {\bf B}^* \cup \{\bot\}\)になります。ここで、 成功した計算の数(標準、出力で指定される連結)と \((\mathrm{IV} \| \mathrm{ciphertext} \| \mathrm{tag})\) \(\bot\): 一部の入力が長すぎる場合。したがって、固定キーの場合、 暗号化関数が \(\mathrm{Enc}_k : {\bf R} \times {\bf B}^* \times {\bf B}^* \rightarrow {\bf B}^* \cup \{\bot\}\)型になります。

復号関数では \(\mathrm{Dec}\) キースペースは同じです。「 入力空間が偶発的に同じ: \({\bf I} ={\bf B}^* \times {\bf B}^*\)、 最初の要素は暗号化関数の出力になります 2 つ目は関連データです

出力空間も偶然に \({\bf O} = {\bf B}^* \cup \{\bot\}\) なります。解釈は若干異なりますが、 as \(\bot\) は通常、認証エラーを示します( (一部の入力が長すぎる場合に備えて出力など)です。

上記の形式化が唯一の選択肢ではないことを強調しておきます。 あります。たとえば、ノンスを入力の一部とみなすことができますが、 (まったく異なるプリミティブが生成されます)。 または、出力をノンスを含むトリプルとして定義することもできます。 (連結ではなく)暗号テキスト、タグで構成されます。または キースペースを(任意に)制限して、 \({\bf K} = \{0,1\}^{128} \cup \{0,1\}^{256}\)。

暗号アルゴリズム:

(対称)暗号アルゴリズムはタプル

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

すべての関数が同じ鍵空間を持つ暗号関数の集合です。「 暗号アルゴリズムのはタプル \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\)です。

たとえば、キー、ノンス、タグの \((s_k, s_n, s_t)\) 有効なトリプルごとに、 AES-GCM\({}_{s_k, s_n, s_t}\) という暗号化アルゴリズムで 2 つの関数 \(\mathrm{Enc}\) と \(\mathrm{Dec}\) 前述のとおりです。

プリミティブとインターフェース

次に、暗号プリミティブを定義します。

基本ロール
プリミティブとは、すべてのアルゴリズムが \((({\bf I}_1, {\bf O}_1), \ldots, ({\bf I}_k, {\bf O}_k))\)型が同じで、アルゴリズムのキースペースがペア単位で互いに素である。

例として、Tink の \(\mathrm{AEAD}\) プリミティブについて考えてみましょう。複数の その中には、鍵サイズが 128 ビットと 256 ビットの AES-GCM の 96 ビット AES-EAX(一部の鍵サイズ)、XChaCha20Poly1305 があります。持っている 互いに素であるものの、どれも同じ暗号機能を提供する \(\mathrm{Enc}\) および \(\mathrm{Dec}\)。(どういうわけか目的が この正式な議論では、AES-GCM の異なる鍵サイズをまとめていますが、 できます)。

プリミティブの定義

プリミティブの通常の考え方としては、最初に そのプリミティブをすべての暗号関数とみなして、 保護します。

たとえば、AEAD の場合、 \(\mathrm{Dec}_k(\mathrm{Enc}_k(m, a), a) = m\) は「always」とします。(ただし、たとえば平文が \(m\) 非常に 。さらに、Google にはセキュリティ特性があります。たとえば 暗号化は意味的に安全です。

AEAD プリミティブは、簡単に言えば、暗号アルゴリズムの集合体であり、 次の条件を満たす必要があります。言い換えると、実際には、特定のサービス アカウントを プロパティに基づいて定義します。リストには、 定義できます。

インターフェース

Tink のインターフェースは、次の意味でプリミティブへのアクセスを提供します。 を使用して、入力空間から出力空間の要素を計算します。たとえば Java の AEAD インターフェースについて考えてみましょう。

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

ランダム性にはアクセスできません。代わりに ユーザーは 入力空間の要素を提供します。ランダム性へのアクセスを禁止するには、 コースを意図的に提供しています1

Tink は、1 つのプリミティブに複数のインターフェースを提供することがあります。 要件が異なることがあるため、これは非常に便利です。それでも、 代償が伴う: 一般に、提供するインターフェースが多ければ多いほど、 相互運用性を確保できますたとえば ユーザーが Tink に基づいてライブラリを記述し、 Aead オブジェクト(内部で暗号化するため)。Tink で提供される特典の数が多すぎる場合、 インターフェースが異なるため、 \(\mathrm{AEAD}\) ユーザーが ユーザーが選択したキーで機能するインスタンスの準備が整っていません。 同時に使用できます。そのため、インターフェースを増やすことはトレードオフとなります。


  1. AEAD 暗号には安全という特性がある 特定の暗号テキスト攻撃に対して対抗できます。 ノンスを再利用します。Tink の Aead インターフェースは、 ノンスの再利用を防止します。ユーザーは、暗号化のための入力としてノンスを指定できません。 暗号化オペレーションのたびに、新しいノンスがランダムに生成されます。