1

我正在处理实现 CNG ECDH,然后我尝试使用 BCRYPT_KDF_SP80056A_CONCAT KDF 派生对称 AES256 密钥 (BCryptDeriveKey())。我遇到了问题(我总是返回 0xc000000d 状态返回。)

我已经成功生成了一个共享密钥,并且我创建了缓冲区 desc“BCryptBufferDesc”,其中包含一个“BCryptBuffer”数组,其中包含 1 个 AlgorithmID、1 个 PartyU 和 1 个 PartyV“其他信息”。我想我已经正确定义和填充了所有结构。我只是为 PartyU 和 PartyV 字节选择一些“值”(我尝试了 1 字节和 16 字节,但我得到了相同的结果)。NIST 文档没有详细说明其他信息应该是什么。

我已经按照 Microsoft 网站来创建这些结构,使用它们的字符串、定义等。我尝试使用标准 L"HASH" kdf,它可以工作,我在两个“边”上都得到了相同的派生密钥,但使用了连接KDF 我总是得到相同的 0xC000000D 状态..

有没有其他人能够成功使用 BCRYPT_KDF_SP80056A_CONCAT CNG KDF?如果你这样做了,你有什么提示吗?

4

1 回答 1

2

这对我有用:

    ULONG derivedKeySize = 32;
    BCryptBufferDesc params;
    params.ulVersion = BCRYPTBUFFER_VERSION;
    params.cBuffers = 3;
    params.pBuffers = new BCryptBuffer[params.cBuffers];
    params.pBuffers[0].cbBuffer = 0;
    params.pBuffers[0].BufferType = KDF_ALGORITHMID;
    params.pBuffers[0].pvBuffer = new byte[0];
    params.pBuffers[1].cbBuffer = 0;
    params.pBuffers[1].BufferType = KDF_PARTYUINFO;
    params.pBuffers[1].pvBuffer = new byte[0];
    params.pBuffers[2].cbBuffer = 0;
    params.pBuffers[2].BufferType = KDF_PARTYVINFO;
    params.pBuffers[2].pvBuffer = new byte[0];

    NTSTATUS rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, NULL, 0, &derivedKeySize, 0);
    if (rv != 0){/*fail*/}

    UCHAR derivedKey = new UCHAR[derivedKeySize];

    rv = BCryptDeriveKey(secretHandle, L"SP800_56A_CONCAT", &params, derivedKey, derivedKeySize, &derivedKeySize, 0);
    if (rv  != 0){/*fail*/}
于 2012-06-10T16:56:24.427 回答