このページでは、キーとプリミティブ出力の 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
エンベロープ暗号化
エンベロープ暗号化では、データ暗号鍵 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_key
と encrypted_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
の後に x
と y
が続きます。
固定サイズの整数として指定します。圧縮された座標の場合、バイト 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
です。ここで、r
と s
は
ゼロパディング、曲線の順番と同じサイズ(バイト単位)を持つ必要があります。対象
たとえば NIST P-256
曲線の場合、r
と s
はゼロパディングされて 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 でエンコードされた署名は無効です)。
これにより、サービス アカウントに影響を与えることの多い 暗号通貨システム。