CryptoAPI генерация RSA ключей

116
12 августа 2019, 02:40

Необходимо генерировать закрытый и открытый ключ.

Код собрал по найденным примерам в сети:

int CreateKeys(CString& strPublicKey, CString& strPrivateKey)
{
    const DWORD KEYLENGTH = 2048 << 16;
    HCRYPTPROV hCryptProv = NULL;
    HCRYPTKEY hKey = NULL;
    DWORD dwBlobLength = 0;
    LPBYTE ppbKeyBlob = NULL;
    if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, CRYPT_NEWKEYSET))    
    {
        if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES, 0))
        {
            return -1;
        }
    }
    if (!CryptGenKey(hCryptProv, CALG_RSA_KEYX, KEYLENGTH | CRYPT_EXPORTABLE | CRYPT_NO_SALT, &hKey))
    {
        return -1;
    }
    HRESULT hr = CryptExportKeyHelper(hKey, NULL, PRIVATEKEYBLOB, &ppbKeyBlob, &dwBlobLength);
    if (FAILED(hr))
    {
        return -1;
    }
    DWORD dwStringLength = 0;
    if (!CryptBinaryToString(ppbKeyBlob, dwBlobLength, CRYPT_STRING_BASE64HEADER, 0, &dwStringLength))
    {
        return -1;
    }
    if (!CryptBinaryToString(ppbKeyBlob, dwBlobLength, CRYPT_STRING_BASE64HEADER, strPrivateKey.GetBuffer(dwStringLength), &dwStringLength))
    {
        return -1;
    }
    CoTaskMemFree(ppbKeyBlob);
    strPrivateKey.ReleaseBuffer();
    hr = CryptExportKeyHelper(hKey, NULL, PUBLICKEYBLOB, &ppbKeyBlob, &dwBlobLength);
    if (FAILED(hr))
    {
        return -1;
    }
    dwStringLength = 0;
    if (!CryptBinaryToString(ppbKeyBlob, dwBlobLength, CRYPT_STRING_BASE64HEADER, 0, &dwStringLength))
    {
        return -1;
    }
    if (!CryptBinaryToString(ppbKeyBlob, dwBlobLength, CRYPT_STRING_BASE64HEADER, strPublicKey.GetBuffer(dwStringLength), &dwStringLength))
    {
        return -1;
    }
    CoTaskMemFree(ppbKeyBlob);
    strPublicKey.ReleaseBuffer();
    CryptDestroyKey(hKey);
    return 0;
}
HRESULT CryptExportKeyHelper(_In_ HCRYPTKEY hKey, _In_opt_ HCRYPTKEY hExpKey, DWORD dwBlobType, _Outptr_result_bytebuffer_(*pcbBlob) BYTE **ppbBlob, _Out_ DWORD *pcbBlob)
{
    *ppbBlob = nullptr;
    *pcbBlob = 0;
    DWORD cbBlob = 0;
    HRESULT hr = CryptExportKey(hKey, hExpKey, dwBlobType, 0, nullptr, &cbBlob) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
    if (SUCCEEDED(hr))
    {
        BYTE *pbBlob = reinterpret_cast<BYTE *>(CoTaskMemAlloc(cbBlob));
        hr = (pbBlob != nullptr) ? S_OK : E_OUTOFMEMORY;
        if (SUCCEEDED(hr))
        {
            hr = CryptExportKey(hKey, hExpKey, dwBlobType, 0, pbBlob, &cbBlob) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
            if (SUCCEEDED(hr))
            {
                *ppbBlob = pbBlob;
                *pcbBlob = cbBlob;
                pbBlob = nullptr;
            }
            CoTaskMemFree(pbBlob);
        }
    }
    return hr;
}

На выходе:

-----BEGIN CERTIFICATE----- BgIAAACkAABSU0ExAAQAAAEAAQBxR/JTB6hqD86PaRQC/CagvUFfJOtap3ocEty4 KWh8KZR8mrYhquFhd1DRtz4a84Mu9CpIBzMFh1MPFRVebYFwqe11L6upzQCH2ryX dbOtcHWGVKRzwg6RhQyljJ9ZLtzD5VL/63HUAodO9xXNhB4eVmmPQ2ETVtrH4axv rgf+uA== -----END CERTIFICATE-----

-----BEGIN CERTIFICATE----- BwIAAACkAABSU0EyAAQAAAEAAQBxR/JTB6hqD86PaRQC/CagvUFfJOtap3ocEty4 KWh8KZR8mrYhquFhd1DRtz4a84Mu9CpIBzMFh1MPFRVebYFwqe11L6upzQCH2ryX dbOtcHWGVKRzwg6RhQyljJ9ZLtzD5VL/63HUAodO9xXNhB4eVmmPQ2ETVtrH4axv rgf+uAed5Ss2kY8iZJec5DKtjr+Jgv+ykcpmyngYkr5hfxESlPBySNCF61DtuJRy jGdHcxd5zeiE9MjoRHPR/vGqI+nHUYrYZS+aH12Q9VnsQc5FFG0fzsa+uS+qnEp/ S+FrTWFUJQeW4wfyw0WhYKa0PYk+vFiFZACswb7BH+bvwiHLV5DexDkNtOSTO+6Q hhBXc2NXGk3z+cSo4ilBnSMh/XrQSReusmzDtilcIqPRUPpPOtEGHIL2QQAFi5gC xvpJZWOth+zMuqu1iliA9iOQWsNkIyAuAocWvS/IabIs7mCEba+B+lWqeiRDi5eA hTTsRY6gKvhxgtXNDyFX1tbLsUdZCGexFvr7Ov0cSn/Iz5jsTPEWI0rIVyH+6jMl uK+eaA/4pvd6sNTirkw8ppEoCCFBvj7pwQx5wrsnv8AqF7OAXXdflCyOXCpA1A/e rTj7+2H315T2X6sQqdAXVoeZzQxbiMpYB7524KRXBo8XU1m8GbM2MbbSorSQnIHt 1t6gFIr2ZAdgRumeBpOSA7FEYbZNqBmRc4fob267KSOGwBsvayYXx5g2b5isJsK8 I0+EN48ox3zmqvc9empgGIG48Wo= -----END CERTIFICATE-----

А должно быть:

-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArtBewZDcVXXw+dtoDbCR 6cZZZvkdbeQcNzKpNS8g6F4BuMuzjkrFyOT7HWGuF0nTd9rkgUM+nQu/zR1LClaV zcZYres1F85yY3vgRE/K4gJw5+nQkVT8e4TbP6vo+YVmDEI9PdsAW/mEH/XeL80s /H/K4BjqNgJK1wcCZQs1L6LxgYK3Au5RCwJJ2Ixi4ka/NFQ+cbLfrrV8gawhzi73 booU/uWVsZxd1lE3GhpbFGRoj8M6eVZi7RIsfcNi0NNo0OVr63f4SlGvAkDRP5qX 7lZvDxzQgu1SaV9SS79G+GLefI3c2C8DzAbjN6SC8P7DCQ2Zy3Cd9ebIeqSb5mJz cwIDAQAB -----END PUBLIC KEY-----

-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDGtt1MVGVT7K68 G1Vyvv6GugCMS2HER+K5hm6Ff+XYkV6WjLHIgEXBcDWHMIuGELUOYBRN2WsO01Nu Z4Q90C4X7SfDOrGmlxSlKSfMbBLQ3JEHFKsOuXAsTx3yD0YQU2DrqJAQHUAxHphH 2cbyNd2gqBS6TkUlgOuKPWITqEMQO7Kf7eg/SS4irECVzCRjMXWIypLYbCA/hLa1 oVCP730FOPsYVTCBQuREGkjL9+HW1HqeaumBPkgQ+sfvvwipTN3t8ZCBi+xpjKcj roGwzQyavH01pV3wwDv69CT8UVq/dHB2yt346sx2hgpljF/kdrjRKbz1USo9GjWT UgY/Hk9FAgMBAAECggEABj46h6pjIJbgCoLlVVyQzJTNbZr0sGD9y4xgrosNIpe2 nA5Bi6YUCvbGh7/LsmOV/KSiHqwFBAs5pM9VxUdkG1ZVGHogmLZIbMP1PyPqF2vG lq1cjnLfBlVaAH/gWKT195FtLURt/t0SNbeu2287zk9Zj1zkKUB6pfY1vZ5ctQbM 2qvmcnwTKzd05d2Y5nvvEu/WTy7M13Ryf2S1dkL6LXwpojS1HRrgDg+FyjpW/tJw 4wCH9EQf/QBtMjwDkqY5Nq+XjsW0q76FOwltrFjOzt20I1bDONAJqbS9i6b5+Ppt m2jO9zt0fopGn22bA80e/VKg6jjGRdnQ9gCdqe0OBQKBgQD9E3YbmZh92/5epmV/ n0axxmvS1Zqlh8mAccOma5QrchcQcfFe011w1nYDOod6wesdQ6hTskZ6WLjJAJFn qwLDEiWQnM/X9Udig+sxEbFNK3qPCIVEGyh8rbideYPGeArmzvZZl2mkSboWSKMn 6FtYlZ0Qmt8TQAwVtr+tHHYYOwKBgQDJAp01aVL8NPJAQ2NQ1Lj2YOeb88KuSKqu g59kZTQZcYU+R5s7QrkrMwJo6NQW3gbeG4wiFJWMraNSxr5/9ntbhch87SgRyYnn DpXYa5M2Nl/FBFtWb9tTKh7m0y5bN1LWI9ytKCKS+hkE70Cxh/a5Utjb/buCNZ2A vSsR014+fwKBgFgUIuH+NgVvwHr+nIqrS3Zp4XLyZq0/shCjB33vKRVp0r8leOUQ 2Q+BhHchMq+1t/dqabYfcMn6AO3r5a9X5FEyCqLnAKtfsWWHFh7w0m1SOYh4ZbFL Zm7mIz+jYAp+EwU7eJ+7w8eq5ToGM8qa4tfU0mJKFGNlwg74mINOSYerAoGAb1lT XNMLdUqfJ5os2gn8q/7iTjGqFoGKi0G+eg7V3YJVHTrtctZzXMrU+uh/FGvJwh/g cMCWV2eYobIWtSwFCZ4CgbGeELxj9+rMdyagVdepFapkLm2oQVmD5Ln3Y/Axow4a oJErFeAVG/atD6sRsXeDSdo0lNy+cyJXSXidLGECgYBXghuvDOVMu2MVbCW1kpVl fK8POnyztDfXKu1eWRk/w4xvVIG539jVX679ujMQmANLilwDYu6Atfb8m6X1CuQh 8p6WTnGCOQlehwHO0qx51RKFLac4l+EWXBCPv0mgZOp/uJAMFBFGqREO7EGYBTGq 5+CMFlXXULvBDEkOpvHI7A== -----END PRIVATE KEY-----

Что я упустил? Может у кого-то есть ссылки на работающий пример?

READ ALSO
Конвертировать черно-белое изображение малого размера в матрицу того же размера на C++

Конвертировать черно-белое изображение малого размера в матрицу того же размера на C++

Допустим есть черно-белое изображение размера 10x10 пикселей, то его нужно перевести в матрицу 10x10 в которой черному цвету будет соответствовать...

101
Вывести все минимальные числа

Вывести все минимальные числа

Есть такое задание: в массиве найти минимальное числоЕсли минимальных чисел несколько, то присвоить им среднее арифметическое исходного...

105
Создать список функций

Создать список функций

И если есть советы как запомнить, буду благодарен)

117
Объект класса в качестве значения map

Объект класса в качестве значения map

Пытаюсь добавить в map элемент класса, выдает что нет подходящего конструктораВот пример кода (для примера взял структуру, но так же не работает...

125