次に、(非公式に、より正式に)2 つの重要な Tink、Primitive、Interface で使用されている言語
基本ロール
プリミティブは、すべてのアルゴリズムに対応する数学的オブジェクト 安全に実行できます。たとえば、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}\)
ユーザーが
ユーザーが選択したキーで機能するインスタンスの準備が整っていません。
同時に使用できます。そのため、インターフェースを増やすことはトレードオフとなります。
-
AEAD 暗号には安全という特性がある 特定の暗号テキスト攻撃に対して対抗できます。 ノンスを再利用します。Tink の Aead インターフェースは、 ノンスの再利用を防止します。ユーザーは、暗号化のための入力としてノンスを指定できません。 暗号化オペレーションのたびに、新しいノンスがランダムに生成されます。 ↩