在许多加密库中,密钥通常仅由一些字节序列标识。例如,OpenSSL 函数(如 EVP_EncryptInit_ex
)除了密钥字节之外,还需要 IV 进行计算;或者 javax.crypto 方法 Cipher.init
,它同时接受密钥序列和 AlgorithmParameterSpec
。此类函数通常难以正确使用,传递错误的参数可能会造成严重后果。
Tink 的目标是有所不同,并希望密钥始终包含密钥材料和元数据(参数)。
例如,完整的 AEAD 密钥会详细指定加密和解密的工作原理,它会指定两个函数 \(\mathrm{Enc}\) 和\(\mathrm{Dec}\),以及密文的编码方式(例如,初始化矢量、加密和标记)。
Tink 中的 AES 密钥不仅是长度为 128 位、192 位或 256 位的字节序列,还会以 parameters 对象的形式存储计算密钥所需的相应算法规范。因此,完整的 AES-EAX 密钥和完整的 AES-GCM 密钥在 Tink 中是不同的对象。