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