Как зашифровать данные (char *), используя RSA в Windows Crypto API и ключ Pem в C ++ - PullRequest
0 голосов
/ 17 декабря 2018

Я должен создать пару ключей (открытый и закрытый (1024)) с веб-сайта: http://travistidwell.com/jsencrypt/demo/

например, здесь мой открытый ключ:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGGKlBoNlzTJXoHGkRLum1kpsv
YRZEhZYpj3H2zfPAHLx6C5ElwbZHMBFarPl0lhP/Ydge3K9KeVmfahyGAz6Hq8LE
GnL5GYP+ef1ov5aMXSVxaWEkiu4BjvyRps5BedTWoyL6Tw7p15wVoxxO4c+mTlxz
6dxHFGpysm3mMAoajwIDAQAB
-----END PUBLIC KEY-----

и вот мой закрытый ключ:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCGGKlBoNlzTJXoHGkRLum1kpsvYRZEhZYpj3H2zfPAHLx6C5El
wbZHMBFarPl0lhP/Ydge3K9KeVmfahyGAz6Hq8LEGnL5GYP+ef1ov5aMXSVxaWEk
iu4BjvyRps5BedTWoyL6Tw7p15wVoxxO4c+mTlxz6dxHFGpysm3mMAoajwIDAQAB
AoGAJB9EiM9BhFOfFhWBIAXZIvZJI2wtyWuK1cs0Ud2MybVz+BRhlyAlb+u84QYz
dHpxDJxY0Yd1GMSzpcO5x0fccd8yPBXIY6Mk3fWZgwx9LcDASpAcaHwzOXFTAF6t
pjxDRry7aiFU6lggHrI09LYeFuBuet+ODLTrHlMuxodcFmECQQDNcoDgU0gxptTe
bKlr28BMpMoe1XrpPsi5VmeJmcukSkZdiYgIFoN9WrFMXQihzKfuQIyNmAJoFcNd
0m++5dGZAkEApxeh3C3/VW0Ga+xEnrJEXY9eDjUcuz1HU9vo1dwi3GSOeT/nqow6
MlAkWxo9edR1zDzNUPFKOj1g2M+kLRC2ZwJAONWeVXB0nle6t7VzwQTP0+QajiEc
mX3m5W7DwcssDM0HXkT3vtULlxgJyEhMZQZKxpxQxbLxp32tyDy48SR+sQJBAJlI
o7LR+4+Jgb+VsmmHDhJqSBVugdn+4CU88v7lgJGAKfdvOX4KQAUR4hg1HTpbPmlL
Seq8P6Tn06Vx7qFs2HcCQQCY2Od7cDSSm8cCJi1s3IL+Rtisnxvg45WqatZAORzM
ovkmQz2yai0gEnP826hrwNMsWe/tbsyCKb84B/Vh9v3d
-----END RSA PRIVATE KEY-----

наконец-то вот мои данные.

const char* Data = "Encrypt me";

теперь мне нужно попытаться зашифровать мои данные char * с открытым ключом RSA, используя только windows crypto api в c ++ и после преобразования encryptзашифрованные данные в BASE64 кодируют.

затем хотите расшифровать закодированные в base64 зашифрованные данные с помощью моего личного ключа.

Пожалуйста, если вы не знаете, не отвечайте и не говорите о cng!

это код, который я копирую, пишу, редактирую.Теперь не понимает, в чем проблема DWORD * outLength

HCRYPTPROV _ServerContextHandle;
    HCRYPTKEY _EncryptionKeyHandle;

    char* inPublicKeyByPemFormat = (char*)"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjLqxm/bYHTwmjj9OT6vJH6BqghLSv4mLJ2AW8EKbmmYSLhv8jDu6GJTjKfrqeXaRXVtz5CxcWgb7f9y7PnAYEsp6GzLMn2SvHF/Q2HxQmBvw2bH0uXM9RC9wneqZcPW8x/qhhxBq3Ux+HQth3KpDdf24c6Ut2+6r6DBqrrFbJs73RwPukuFLNzbi/bWxh3Ib4pti0OoSHGylZRddwdGlqL0SEpuWt7ZdJYEHOQM4jFs/T6ThDTEsPytxYAEHWrckRcMIUIylMppCGy28ysguql5pZo+JHoyL+ZfOgPTzBwM8keXunCfPEaYn4fwjwWyFQHlZkMy6npyCD1zZ0Ke2FQIDAQAB-----END PUBLIC KEY-----";

    HCRYPTPROV serverContextHandle;

    bool result = CryptAcquireContextW(&serverContextHandle, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == TRUE;

    if (result)
    {
        _ServerContextHandle = serverContextHandle;

        BYTE derPublicKey[2048];
        DWORD derPublicKeyLength = 2048;

        result = CryptStringToBinaryA(inPublicKeyByPemFormat, 0, CRYPT_STRING_BASE64HEADER, derPublicKey, &derPublicKeyLength, NULL, NULL) == TRUE;

        CERT_PUBLIC_KEY_INFO* publicKeyInfo = NULL;
        DWORD publicKeyInfoLength;

        if (result)
        {
            result = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, X509_PUBLIC_KEY_INFO, derPublicKey, derPublicKeyLength, CRYPT_ENCODE_ALLOC_FLAG, NULL, &publicKeyInfo, &publicKeyInfoLength) == TRUE;
        }

        HCRYPTKEY encryptionKeyHandle;

        if (result)
        {
            result = CryptImportPublicKeyInfo(_ServerContextHandle, X509_ASN_ENCODING, publicKeyInfo, &encryptionKeyHandle) == TRUE;
        }

        LocalFree(publicKeyInfo);

        if (result)
        {
            _EncryptionKeyHandle = encryptionKeyHandle;
        }
    }
    BYTE* inData = (BYTE*)"Hello!";
    DWORD inDataLength = 6;
    DWORD* outLength = 0;

    BYTE* resulte = NULL;

    //*outLength = 0;

    DWORD length = inDataLength;

    result = inData;

    if (!CryptEncrypt(_EncryptionKeyHandle, NULL, TRUE, 0, resulte, &length, length))
    {
        delete resulte;

        result = new BYTE[length];

        resulte = inData;

        *outLength = inDataLength;

        if (!CryptEncrypt(_EncryptionKeyHandle, NULL, TRUE, 0, resulte, outLength, length))
        {
            delete resulte;

            resulte = NULL;

            *outLength = 0;
        }
    }
    else
    {
        *outLength = length;
    }

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

CryptAcquireContext , CryptImportKey , CryptEncrypt .

Ключи, закодированные в Base64, не поддерживаются импортом CryptoAPI, их необходимо сохранить как DER.В любом случае, почему вы интересуетесь всеми этими старыми вещами?КПГ намного лучше.Если вы пришли из openssl-подобного, вещи в crypto и CNG API сильно отличаются.

Если (как мне кажется) это работа или школьное задание, то вы немного далеки от понимания того, чтодействительно происходит.

0 голосов
/ 17 декабря 2018

API криптографии: следующее поколение

API криптографии: следующее поколение (CNG) - это долгосрочная замена CryptoAPI.СПГ спроектирован так, чтобы быть расширяемым на многих уровнях и не зависящим от криптографии в поведении.

На веб-сайте предлагается, чтобы все существующие и новые сервисы начали использовать этот новый API вместо CryptoAPI.- Ссылка

Редактировать: На странице документации есть пример , если вы хотите использовать только old поколение одноЭто должно помочь вам.(Низкая репутация, поэтому комментарии для меня запрещены)

...