我正在尝试编写代码来解密 PHP 中的 JWE 令牌,因为现有库不支持我需要的算法(A128CBC+HS256
,这是一个已弃用的算法)。
我的问题是我无法理解如何生成使用“连接密钥派生函数”的内容加密密钥(请参阅此处的第 5.8.1 节:http: //csrc.nist.gov/publications/nistpubs/800-56A/ SP800-56A_Revision1_Mar08-2007.pdf)。该功能的符号和解释超出了我的想象。
我正在根据JOSE JSON 网络算法草案 06获得我的价值观。
到目前为止,我的代码的相关部分如下所示:
// Derive CBC encryption & integrity keys
$shaSize = 256;
$encryptionKeySize = $shaSize / 2;
$integrityKeySize = $shaSize;
// Calculate the key derivation using Concat KDF for the content
// encryption key
$encryptionSegments = [
$masterKey, // Z
$encryptionKeySize, // keydatalen
$this->packInt32sBe($encryptionKeySize) . utf8_encode('A128CBC+HS256'), // AlgorithmID
$this->packInt32sBe(0), // PartyUInfo
$this->packInt32sBe(0), // PartyUInfo
'Encryption', // SuppPubInfo
$this->packInt32sBe(1), // SuppPrivInfo
];
// Calculate the SHA256 digest
$cek = hex2bin(hash('sha256', implode('', $encryptionSegments)));
可能相关的是,我获取大端整数的函数:
public function packInt32sBe($n)
{
if (pack('L', 1) === pack('N', 1)) {
return pack('l', $n);
}
return strrev(pack('l', $n));
}
此处未显示的唯一变量$masterKey
是解密的内容主密钥。