Tink ワイヤーの形式

このページでは、キーとプリミティブ出力の Tink ワイヤ形式について説明します。「 追加の言語を追加する暗号担当者向けのドキュメントです。 Tink と、ワイヤーを必要とする他の高水準の暗号ライブラリのメンテナンス担当者 使用できます。一般ユーザーを対象としたものではありません。

鍵セットのシリアル化

Tink は Google protobuf を使用して鍵セットをシリアル化します。

  • バイナリのシリアル化された鍵セットは、シリアル化された鍵セットの proto です。 tink.proto.キーの KeyData 値プロパティは、シリアル化された 対応する鍵タイプの proto。
  • JSON シリアル化された鍵セットは、JSON 形式でシリアル化された Keyset プロトコルです。 KeyData 値は、バイナリでシリアル化された proto であることに注意してください。
  • 暗号化された鍵セットは、シリアル化された EncryptedKeyst プロトコルで、 tink.proto.暗号化されたバイナリのシリアル化された鍵セットが含まれている 暗号化されていない KeysetInfo メタデータをオプションとして提供します。

Tink 出力接頭辞

ほとんどの Tink プリミティブは、以下で構成される 5 バイトの出力プレフィックスをサポートしています。

  • 1 バイトのバージョン: 0x01
  • 4 バイトのキーのヒント: これは使用されるキーのキー ID です。

以前の鍵によっては、バージョン バイト 0x00 がサポートされている場合もあります。

この接頭辞は認証されないため、セキュリティに頼ることはできません あります。Tink はこれを、復号や検証をスピードアップするためのヒントとして使用します。

AEAD

一般に、Tink は AEAD 暗号テキストを次のようにフォーマットします。

prefix || IV || ciphertext || tag

必要があります。prefix は空です または 5 バイトの Tink 出力プレフィックスを使用します。

AES-CTR-HMAC

AES-CTR-HMAC の場合、Tink は次のように関連データ(AD)を使用して MAC を計算します。

AD || IV || ciphertext || bitlen(AD)

bitlen(AD) は、64 ビット ビッグ エンディアンで表される AD の長さ(ビット数)です。 符号なし整数。この HMAC スキームは、 Mcgrew.

決定論的 AEAD

Tink は AES-SIV に関する RFC 5297 を実装し、 初期化ベクトル(SIV)を暗号化します。 プリミティブは 5 バイトの Tink 出力プレフィックスを追加できます。

RFC 5297 は関連データのリストをサポートしていますが、Tink は完全に 1 つの関連データ(RFC 5297 の 1 つの要素を含むリストに対応) 空の関連データは、空の要素が 1 つ含まれたリストです。 選択します。

ストリーミング AEAD

AES-CTR HMACAES-GCM-HKDF

エンベロープ暗号化

エンベロープ暗号化では、データ暗号鍵 DEK でデータを暗号化します。 Tink の AEAD プリミティブ。暗号化は次のように機能します。

  • 指定されたキー テンプレート(またはキーパラメータ)を使用して、新しい DEK が生成されます。
  • DEK はバイト文字列にシリアル化されます。シリアル化形式 キー型 proto のプロトコル バッファのシリアル化。たとえば、これは シリアル化された AesGcmKey プロトコル バッファ メッセージ aes_gcm.proto: 鍵タイプ AES GCM の DEK。 シリアル化する方法については、プロトコル バッファのシリアル化をご覧ください。 プロトコル バッファです。
  • シリアル化された DEK が外部プロバイダ(GCP など)によって暗号化されている。 encrypted DEK に変換します。
  • DEK は、関連データを含む平文を暗号化し、 ciphertext。そのため、ciphertext の形式は AEAD プリミティブとまったく同じです。 (DEK に対応する)。

エンベロープ暗号化の出力形式は次のとおりです。

encrypted DEK length || encrypted DEK || ciphertext

encrypted DEK length は 4 バイトで、encrypted DEK の長さを格納します。 32 ビットのビッグ エンディアン整数で指定する必要があります。

MAC

Tink は対応する RFC に準拠しています。プリミティブは 5 バイトの Tink 出力を追加できる プレフィックスを追加します。

PRF セット

Tink は対応する RFC に準拠しています。PRF セットの場合、鍵のタイプは 出力の長さを含めないことで、同じアルゴリズムの MAC 鍵タイプから分離されます。 PRF Set キーによって Tink 出力接頭辞が追加されることはありません。これにより、出力が意図したとおりに PRF です

ハイブリッド暗号化

Tink ハイブリッド暗号化の一般的な送信形式は次のとおりです。

prefix || encapsulated_key || encrypted_data

prefix は、空または 5 バイトの Tink 出力接頭辞です。各キータイプには、 パースするバイト数とそのバイトをパースする方法に関する情報が encapsulated_key

HPKE(ハイブリッド公開鍵暗号化)

Tink は、RFC 9180 で定義されている HPKE 標準に準拠しています。 HPKE 暗号スイートには、次の 3 つのプリミティブが含まれています。

  • 鍵カプセル化メカニズム(KEM)
  • 鍵導出関数(KDF)
  • 関連データによる認証済み暗号化(AEAD)

HPKE 規格では、一般的な送信形式は RFC 9180, Section 10。Tink の HPKE の実装では、次のものを使用します。 encapsulated_keyencrypted_data の値。

  • encapsulated_key
    • 送信者のシリアル化された公開鍵
    • enc として定義: RFC 9180、セクション 4.1
    • 使用される特定の HPKE KEM によって形式が決まります
  • encrypted_data
    • 暗号テキストとタグ(ciphertext || tag(IV なし)
    • ct として定義: RFC 9180、セクション 4
    • 使用される特定の HPKE AEAD によって決定される形式
X25519 Diffie-Hellman ベースの KEM

X25519 DHKEM の場合、値 enc は送信者の 32 バイトの Diffie-Hellman パブリックです。 ] キーを押します。

ECIES-AEAD-HKDF

Tink の ECIES-AEAD-HKDF 実装では、encapsulated_key が出力です。 鍵カプセル化メカニズム(KEM)のもので、encrypted_data は データ カプセル化メカニズム(DEM)について学びました。

KEM

キーの種類に応じて、Tink は圧縮および非圧縮の楕円曲線を使用します。 RFC 8422/ANSI.X9-62.2005 エンコード標準に従って、すべてのポイントを暗号化します。対象 非圧縮ポイントの場合、バイト 0x04 の後に xy が続きます。 固定サイズの整数として指定します。圧縮された座標の場合、バイト 0x02 または 0x03 で、固定サイズの整数としての x 座標が使用されます。X25519 の場合、 RFC 7748 定義(固定サイズの整数としての x 座標)が使用されます。

DEM

encrypted_data については、Tink は AEAD と同じ形式を使用します。例 IV を指定します。

鍵の派生

まず、共有点の x 座標 x_ss を計算します。Pod の AEAD は次のように設定します。

HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)

ここで、encapsulated_key はバイトとしての KEM の完全な出力です。

デジタル署名

Tink は対応する RFC に準拠しています。プリミティブは 5 バイトの Tink 出力を追加できる 接頭辞が付加されます。

ECDSA

鍵の EcdsaSignatureEncoding フィールドに応じて、 ECDSA 署名の形式が IEEE P1363 または ASN.1 DER である。

IEEE P1363 署名の形式は r || s です。ここで、rs は ゼロパディング、曲線の順番と同じサイズ(バイト単位)を持つ必要があります。対象 たとえば NIST P-256 曲線の場合、rs はゼロパディングされて 32 バイトになります。

DER 署名は ASN.1 を使用してエンコードされます。

ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }

具体的には、エンコードは次のようになります。

0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s

Tink は署名検証のベスト プラクティスに従って、 DER でエンコードされた ECDSA 署名(代替の BER でエンコードされた署名は無効です)。

これにより、サービス アカウントに影響を与えることの多い 暗号通貨システム