メインコンテンツまでスキップ

5. 暗号化オブジェクト

  1. 暗号化オブジェクト

COSEは2つの異なる暗号化構造をサポートしています。COSE_Encrypt0は、使用する鍵が暗黙的にわかっているため、受信者構造が必要ない場合に使用されます。COSE_Encryptはそれ以外の場合に使用されます。これには、複数の受信者がいる場合や、直接(つまり、事前共有秘密)以外の受信者アルゴリズムが使用される場合が含まれます。

5.1. エンベロープCOSE構造

エンベロープ構造は、メッセージの1つ以上の受信者を許可します。コンテンツに関するヘッダーパラメータと、メッセージで運ばれる受信者情報に関するヘッダーパラメータの規定があります。コンテンツに関連付けられた保護されたヘッダーパラメータは、コンテンツ暗号化アルゴリズムによって認証されます。受信者に関連付けられた保護されたヘッダーパラメータ(アルゴリズムがサポートする場合)は、受信者アルゴリズムによって認証されます。コンテンツに関するヘッダーパラメータの例は、コンテンツのタイプとコンテンツ暗号化アルゴリズムです。受信者に関するヘッダーパラメータの例は、受信者の鍵識別子と受信者の暗号化アルゴリズムです。

平文と鍵の両方を暗号化するために、同じ技術とほぼ同じ構造が使用されます。これは、コンテンツ層と受信者層に異なる構造を使用する「Cryptographic Message Syntax (CMS)」[RFC5652]および「JSON Web Encryption (JWE)」[RFC7516]の両方で使用されるアプローチとは異なります。2つの構造が定義されています。暗号化されたコンテンツを保持するCOSE_Encryptと、受信者の暗号化された鍵を保持するCOSE_recipientです。エンベロープメッセージの例は、付録C.3に記載されています。

COSE_Encrypt構造は、使用されるコンテキストに応じて、タグ付きまたはタグなしとしてエンコードできます。タグ付きCOSE_Encrypt構造は、CBORタグ96によって識別されます。これを表すCDDLフラグメントは次のとおりです:

COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)

COSE_Encrypt構造はCBOR配列です。配列のフィールドは順に次のとおりです:

protected(保護された): これは第3節で説明されている通りです。

unprotected(保護されていない): これは第3節で説明されている通りです。

ciphertext(暗号文): このフィールドには、bstrとしてエンコードされた暗号文が含まれます。暗号文が暗号化プロセスに関する制御情報とは独立して転送される場合(つまり、分離コンテンツ)、フィールドはnil値としてエンコードされます。

recipients(受信者): このフィールドには、受信者情報構造の配列が含まれます。受信者情報構造のタイプはCOSE_recipientです。

上記のテキストに対応するCDDLフラグメントは次のとおりです:

COSE_Encrypt = [ Headers, ciphertext : bstr / nil, recipients : [+COSE_recipient] ]

COSE_recipient構造はCBOR配列です。配列のフィールドは順に次のとおりです:

protected(保護された): これは第3節で説明されている通りです。

unprotected(保護されていない): これは第3節で説明されている通りです。

ciphertext(暗号文): このフィールドには、bstrとしてエンコードされた暗号化された鍵が含まれます。すべてのエンコードされた鍵は対称鍵です。鍵のバイナリ値がコンテンツです。暗号化された鍵がない場合、このフィールドはnil値としてエンコードされます。

recipients(受信者): このフィールドには、受信者情報構造の配列が含まれます。受信者情報構造のタイプはCOSE_recipientです(これの例は付録Bにあります)。受信者情報構造がない場合、この要素は存在しません。

上記のCOSE_recipientのテキストに対応するCDDLフラグメントは次のとおりです:

COSE_recipient = [ Headers, ciphertext : bstr / nil, ? recipients : [+COSE_recipient] ]

5.1.1. コンテンツ鍵配布方法

暗号化されたメッセージは、暗号化されたコンテンツと、1つ以上の受信者用の暗号化されたCEKで構成されます。CEKは、各受信者に対して、その受信者に固有の鍵を使用して暗号化されます。この暗号化の詳細は、受信者アルゴリズムがどのクラスに分類されるかによって異なります。各クラスの具体的な詳細は、第8.5節に記載されています。5つのコンテンツ鍵配布方法の簡単な要約は次のとおりです:

direct(直接): CEKは、以前に配布された対称鍵と同じか、以前に配布された秘密から派生したものです。CEKはメッセージで転送されません。

symmetric key-encryption keys (KEKs)(対称鍵暗号化鍵): CEKは、以前に配布された対称KEKを使用して暗号化されます。キーラップとも呼ばれます。

key agreement(鍵共有): 受信者の公開鍵と送信者の秘密鍵を使用してペアワイズシークレットを生成し、鍵導出関数(KDF)を適用して鍵を導出します。その後、CEKは導出された鍵であるか、導出された鍵によって暗号化されます。

key transport(鍵転送): CEKは受信者の公開鍵で暗号化されます。

passwords(パスワード): CEKは、パスワードから派生したKEKで暗号化されます。このドキュメントが公開された時点では、パスワードアルゴリズムは定義されていません。

5.2. 単一受信者暗号化

COSE_Encrypt0暗号化構造には、メッセージの受信者を指定する機能がありません。この構造は、オブジェクトの受信者がメッセージを復号するために使用される鍵のIDをすでに知っていることを前提としています。鍵を受信者に識別させる必要がある場合は、エンベロープ構造を使用すべきです。

暗号化されたメッセージの例は、付録C.4に記載されています。

COSE_Encrypt0構造は、使用されるコンテキストに応じて、タグ付きまたはタグなしとしてエンコードできます。タグ付きCOSE_Encrypt0構造は、CBORタグ16によって識別されます。これを表すCDDLフラグメントは次のとおりです:

COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)

COSE_Encrypt0構造はCBOR配列です。配列のフィールドは順に次のとおりです:

protected(保護された): これは第3節で説明されている通りです。

unprotected(保護されていない): これは第3節で説明されている通りです。

ciphertext(暗号文): これは第5.1節で説明されている通りです。

上記のテキストに対応するCOSE_Encrypt0のCDDLフラグメントは次のとおりです:

COSE_Encrypt0 = [ Headers, ciphertext : bstr / nil, ]

5.3. AEADアルゴリズムの暗号化と復号の方法

AEADアルゴリズムの暗号化アルゴリズムは非常に単純です。最初のステップは、認証データ構造用の一貫したバイト文字列を作成することです。この目的のために、Enc_structureを使用します。Enc_structureはCBOR配列です。Enc_structureのフィールドは順に次のとおりです:

  1. 認証データ構造のコンテキストを識別するコンテキストテキスト文字列。コンテキストテキスト文字列は次のとおりです:

    "Encrypt0":COSE_Encrypt0データ構造のコンテンツ暗号化用。

    "Encrypt":COSE_Encryptデータ構造の最初の層(つまり、コンテンツ暗号化用)。

    "Enc_Recipient":COSE_Encryptデータ構造に配置される受信者エンコーディング用。

    "Mac_Recipient":MACメッセージ構造に配置される受信者エンコーディング用。

    "Rec_Recipient":受信者構造に配置される受信者エンコーディング用。

  2. 本文構造からの保護された属性。bstrタイプでエンコードされます。保護された属性がない場合は、長さゼロのバイト文字列が使用されます。

  3. アプリケーションからの外部提供データ。bstrタイプでエンコードされます。このフィールドが提供されない場合、デフォルトは長さゼロのバイト文字列になります。(このフィールドの構築に関するアプリケーションガイダンスについては、第4.3節を参照してください。)

上記のテキストを記述するCDDLフラグメントは次のとおりです:

Enc_structure = [ context : "Encrypt" / "Encrypt0" / "Enc_Recipient" / "Mac_Recipient" / "Rec_Recipient", protected : empty_or_serialized_map, external_aad : bstr ]

メッセージを暗号化する方法:

  1. Enc_structureを作成し、適切なフィールドを入力します。

  2. 第9節で説明されているエンコーディングを使用して、Enc_structureをバイト文字列(追加認証データ(AAD))にエンコードします。

  3. 暗号化鍵(K)を決定します。このステップは、使用されている受信者アルゴリズムのクラスに依存します。以下の場合:

    No Recipients(受信者なし): 使用する鍵は、現在の層のアルゴリズムと鍵によって決定されます。例としては、キーラップ鍵(第8.5.2節)や事前共有秘密があります。

    Direct Encryption and Direct Key Agreement(直接暗号化と直接鍵共有): 鍵は、受信者構造の鍵とアルゴリズムによって決定されます。暗号化アルゴリズムと使用する鍵のサイズは、受信者に使用されるKDFへの入力です。(直接の場合、KDFは恒等操作と見なすことができます。)これらのアルゴリズムの例は、[RFC9053]の第6.1節と第6.3節にあります。

    Other(その他): 鍵はランダムに生成されます。

  4. K(暗号化鍵)、P(平文)、およびAADを使用して暗号化アルゴリズムを呼び出します。返された暗号文を構造の「ciphertext」フィールドに配置します。

  5. 非直接アルゴリズムを使用するメッセージの受信者の場合、K(暗号化鍵)を平文として使用し、その受信者の暗号化アルゴリズムを再帰的に実行します。

メッセージを復号する方法:

  1. Enc_structureを作成し、適切なフィールドを入力します。

  2. 第9節で説明されているエンコーディングを使用して、Enc_structureをバイト文字列(AAD)にエンコードします。

  3. 復号鍵を決定します。このステップは、使用されている受信者アルゴリズムのクラスに依存します。以下の場合:

    No Recipients(受信者なし): 使用する鍵は、現在の層のアルゴリズムと鍵によって決定されます。例としては、キーラップ鍵(第8.5.2節)や事前共有秘密があります。

    Direct Encryption and Direct Key Agreement(直接暗号化と直接鍵共有): 鍵は、受信者構造の鍵とアルゴリズムによって決定されます。暗号化アルゴリズムと使用する鍵のサイズは、受信者に使用されるKDFへの入力です。(直接の場合、KDFは恒等操作と見なすことができます。)

    Other(その他): 鍵は、受信者構造の1つをデコードおよび復号することによって決定されます。

  4. K(使用する復号鍵)、C(暗号文)、およびAADを使用して復号アルゴリズムを呼び出します。

5.4. AEアルゴリズムの暗号化と復号の方法

メッセージを暗号化する方法:

  1. 「protected」フィールドが長さゼロのバイト文字列であることを確認します。

  2. この操作に対して外部追加認証データが提供されなかったことを確認します。

  3. 暗号化鍵を決定します。このステップは、使用されている受信者アルゴリズムのクラスに依存します。以下の場合:

    No Recipients(受信者なし): 使用する鍵は、現在の層のアルゴリズムと鍵によって決定されます。例としては、キーラップ鍵(第8.5.2節)や事前共有秘密があります。

    Direct Encryption and Direct Key Agreement(直接暗号化と直接鍵共有): 鍵は、受信者構造の鍵とアルゴリズムによって決定されます。暗号化アルゴリズムと使用する鍵のサイズは、受信者に使用されるKDFへの入力です。(直接の場合、KDFは恒等操作と見なすことができます。)これらのアルゴリズムの例は、[RFC9053]の第6.1節と第6.3節にあります。

    Other(その他): 鍵はランダムに生成されます。

  4. K(使用する暗号化鍵)とP(平文)を使用して暗号化アルゴリズムを呼び出します。返された暗号文を構造の「ciphertext」フィールドに配置します。

  5. 非直接アルゴリズムを使用するメッセージの受信者の場合、K(暗号化鍵)を平文として使用し、その受信者の暗号化アルゴリズムを再帰的に実行します。

メッセージを復号する方法:

  1. 「protected」フィールドが長さゼロのバイト文字列であることを確認します。

  2. この操作に対して外部追加認証データが提供されなかったことを確認します。

  3. 復号鍵を決定します。このステップは、使用されている受信者アルゴリズムのクラスに依存します。以下の場合:

    No Recipients(受信者なし): 使用する鍵は、現在の層のアルゴリズムと鍵によって決定されます。例としては、キーラップ鍵(第8.5.2節)や事前共有秘密があります。

    Direct Encryption and Direct Key Agreement(直接暗号化と直接鍵共有): 鍵は、受信者構造の鍵とアルゴリズムによって決定されます。暗号化アルゴリズムと使用する鍵のサイズは、受信者に使用されるKDFへの入力です。(直接の場合、KDFは恒等操作と見なすことができます。)これらのアルゴリズムの例は、[RFC9053]の第6.1節と第6.3節にあります。

    Other(その他): 鍵は、受信者構造の1つをデコードおよび復号することによって決定されます。

  4. K(使用する復号鍵)とC(暗号文)を使用して復号アルゴリズムを呼び出します。