当我尝试导入公钥

时间:2017-09-12 21:15:45

标签: c++11 winapi cryptoapi cng wincrypt

我跟着this example。我试图将我从服务器获得的公钥添加到密钥对中,我得到STATUS_INVALID_PARAMETER。

    BCRYPT_DH_KEY_BLOB header;
    header.dwMagic = BCRYPT_DH_PUBLIC_MAGIC;
    header.cbKey = (ULONG)(pub_key.size());
    cout << "header contents " << header.dwMagic << " : " << header.cbKey << endl;
    memcpy(&pubKeyBlobFromServer[0], &header, sizeof(BCRYPT_DH_KEY_BLOB));
    // copy Public key
    cout << "size of pub_key " << pub_key.size() << endl;
    cout << "size of pubKeyBlobFromServer before :" << pubKeyBlobFromServer.size() << endl;
    cout << "size of BCRYPT_DH_KEY_BLOB " << sizeof(BCRYPT_DH_KEY_BLOB) << endl;
    pubKeyBlobFromServer.insert(pubKeyBlobFromServer.end(), pub_key.begin(), pub_key.end());
    cout << "size of pubKeyBlobFromServer after :" << pubKeyBlobFromServer.size() << endl;
    Status = BCryptImportKeyPair(
                                        ExchAlgHandleB,             // Alg handle
                                        nullptr,                       // Parameter not used
                                        BCRYPT_DH_PUBLIC_BLOB,      // Blob type (Null terminated unicode string)
                                        &PubKeyHandleB,             // Key handle that will be recieved
                                        const_cast<PUCHAR>(pubKeyBlobFromServer.data()),            // Buffer than points to the key blob
                                        (ULONG)pubKeyBlobFromServer.size(),     // Buffer length in bytes
                                        0);                         // Flags

我得到以下输出。

header contents 1112557636 : 128
size of pub_key 128
size of pubKeyBlobFromServer before :8
size of BCRYPT_DH_KEY_BLOB 8
size of pubKeyBlobFromServer after :136

我尝试打印pubKeyBlobFromServer的字节。公钥从第8个字节开始。前8个保留给BCRYPT_DH_KEY_BLOB。我不确定是什么问题。请建议我犯错误的地方。如果没有,请建议一个从字符串导入公钥的示例。在此先感谢。

1 个答案:

答案 0 :(得分:1)

Microsoft的示例代码简单易用;因为相同的API导出了密钥,所以它已经是正确的格式。

为了自己构建有效的密钥blob,您需要查找the documentation for the BCRYPT_DH_KEY_BLOB structure

  

Diffie-Hellman公钥BLOB(BCRYPT_DH_PUBLIC_BLOB)在连续内存中具有以下格式。模数,生成器和公共数字采用大端格式。

BCRYPT_DH_KEY_BLOB
Modulus[cbKey] // Big-endian.
Generator[cbKey] // Big-endian.
Public[cbKey] // Big-endian.

您的代码看起来只包含三个组件中的一个。