多くの暗号ライブラリでは、キーは一部のバイト シーケンスのみで識別されます。たとえば、鍵バイト以外に計算に IV も必要とする EVP_EncryptInit_ex
などの OpenSSL 関数や、鍵シーケンスと AlgorithmParameterSpec
の両方を受け取る javax.crypto メソッド Cipher.init
などがあります。このような関数は正しく使用するのが難しいことが多く、間違ったパラメータを渡すと深刻な結果を招く可能性があります。
Tink は、鍵マテリアルとメタデータ(パラメータ)の両方から常に構成されるキーを想定しています。
たとえば、完全な AEAD 鍵では、暗号化と復号の仕組みが正確に指定されます。2 つの関数 \(\mathrm{Enc}\) と\(\mathrm{Dec}\)が指定され、暗号テキストのエンコード方法(初期化ベクトル、暗号化、タグなど)も指定されます。
Tink の AES 鍵は、長さが 128 ビット、192 ビット、256 ビットのバイト シーケンスであるだけでなく、鍵の計算に必要な対応するアルゴリズム仕様を parameters オブジェクトの形式で格納します。したがって、完全な AES-EAX 鍵と完全な AES-GCM 鍵は、Tink では異なるオブジェクトです。