既存のライブラリは必要なアルゴリズムをサポートしていないため、PHP で JWE トークンを復号化するコードを作成しようとしています ( A128CBC+HS256
、非推奨のアルゴリズムです)。
私の問題は、「連結キー導出関数」を使用するコンテンツ暗号化キーを生成する方法を理解できないことです (ここのセクション 5.8.1 を参照してください: http://csrc.nist.gov/publications/nistpubs/800-56A/ SP800-56A_Revision1_Mar08-2007.pdf )。関数の記号と説明が頭をよぎります。
JOSE JSON Web アルゴリズム ドラフト 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
は、復号化されたコンテンツ マスター キーです。