Как использовать BCrypt для RSA (асимметричное шифрование)

Я пытаюсь сделать простой рабочий пример шифрования и дешифрования с помощью BCrypt, но не могу заставить его работать, потому что не понимаю, как именно. Из функции BCryptEncrypt, Microsoft Docs :

NTSTATUS BCryptEncrypt(
  BCRYPT_KEY_HANDLE hKey,
  PUCHAR            pbInput,
  ULONG             cbInput,
  VOID              *pPaddingInfo,
  PUCHAR            pbIV,
  ULONG             cbIV,
  PUCHAR            pbOutput,
  ULONG             cbOutput,
  ULONG             *pcbResult,
  ULONG             dwFlags
);

Я сгенерировал простую пару 512-битных ключей на 8gwifi.org:

string Public_Key = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJSNbUhCkU9RuY99L8kC2WRJ8TBES3WX1u9wYlANvUFU/h7lU8VNOWI8dNGCQ6UbK2ypHFom+Zm4BaG1zokwcUkCAwEAAQ==";
string Private_Key = "MIIBOgIBAAJBAJSNbUhCkU9RuY99L8kC2WRJ8TBES3WX1u9wYlANvUFU/h7lU8VNOWI8dNGCQ6UbK2ypHFom+Zm4BaG1zokwcUkCAwEAAQJAZ9bwZAl8L5jt//o/E+C0+2Cggt/Ka5nG+bpyTok8GNTyaG+Prmz/QCYdI3VuYdONdfAPm3jLwtbK9wTt1E8HAQIhAM8jg1nwjN9+nhPyFo0F+2o8y47mq1kHnCn+gqAdW8MhAiEAt5gQcCqX2Y5KbmMoqtQ+4RIEHQ8HD+fyGqxWUhVpESkCIEtylQJqgvVZCj0bnakqN6Q/lqlrTZg1FGWbZXrqlqThAiEAilt5v94Jc7Ws2AW4Rw0OmfVGzlNd4hnNNVa88r0Z4gkCIGfFy2H8pGxHxg1GKE2mSZAfpRMyjqeq119S3t/bhqY2";
string Encrypt_Me = "Hello World";

Честно говоря, я не совсем понимаю, как использовать эту функцию в этой ситуации, я пытался найти простой пример, но не смог его найти.

Спасибо.


person roberto carlos    schedule 16.10.2019    source источник
comment
Как вы думаете, почему Bcrypt имеет какое-то отношение к RSA? Это не так. Возможно, вы сможете сделать шаг назад перед Bcrypt и RSA и рассказать нам, какую проблему вы пытаетесь решить.   -  person President James K. Polk    schedule 16.10.2019
comment
Согласно документам CNG, я могу использовать BCrypt для асимметричного шифрования с использованием алгоритма RSA. Я пытаюсь сделать простой пример, чтобы учиться. Я не могу продвинуться вперед, потому что не могу найти ни одного примера асимметричного шифрования с использованием CNG с парой ключей в виде обычного текста.   -  person roberto carlos    schedule 16.10.2019
comment
Ах, мои извинения, Роберто, теперь я вижу, что Bcrypt от Microsoft — это не тот Bcrypt, который я ожидал. Неважно   -  person President James K. Polk    schedule 16.10.2019
comment
Без проблем! Спасибо, в любом случае.   -  person roberto carlos    schedule 16.10.2019


Ответы (1)


Здесь есть образец: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/007a0e26-7fc0-4079-9b63-2ad23f866836/bug-in-rsa-encryptiondecryption-using-cng?forum=windowssdk

Обратите внимание, что первый байт зашифрованных данных не должен превышать 0xb6. И в посте есть подробное объяснение.

Возьмем в качестве примера шифрование. Во-первых, используйте BCryptOpenAlgorithmProvider для загрузки и инициализации поставщика CNG, указывающего RSA.

#define NT_SUCCESS(Status)          (((NTSTATUS)(Status)) >= 0)
status = BCryptOpenAlgorithmProvider(&hAlgorithm,
    BCRYPT_RSA_ALGORITHM,
    NULL,
    0);
if (!NT_SUCCESS(status)) {
    printf("Failed to get algorithm provider..status : %08x\n", status);
    goto cleanup;
}

Затем BCryptImportKeyPair

status = BCryptImportKeyPair(hAlgorithm,
    NULL,
    BCRYPT_RSAPUBLIC_BLOB,
    &hKey,
    PublicKey,
    PublicKeySize,
    BCRYPT_NO_KEY_VALIDATION);
if (!NT_SUCCESS(status)) {
    printf("Failed to import Private key..status : %08x\n", status);
    goto cleanup;
}

Чтобы получить размер зашифрованного буфера:

status = BCryptEncrypt(hKey,
    InputData,
    InputDataSize,
    NULL,
    NULL,
    0,
    NULL,
    0,
    &EncryptedBufferSize,
    0
);
if (!NT_SUCCESS(status)) {
    printf("Failed to get required size of buffer..status : %08x\n", status);
    goto cleanup;
}

encryptedBuffer = (PUCHAR)HeapAlloc(GetProcessHeap(), 0, encryptedBufferSize);
if (encryptedBuffer == NULL) {
    printf("failed to allocate memory for blindedFEKBuffer\n");
    goto cleanup;
}

Зашифровать данные:

status = BCryptEncrypt(hKey,
    InputData,
    InputDataSize,
    NULL,
    NULL,
    0,
    encryptedBuffer,
    encryptedBufferSize,
    &encryptedBufferSize,
    0
);

if (!NT_SUCCESS(status)) {
    printf("Failed encrypt data..status : %08x\n", status);
    goto cleanup;
}
cleanup:
if (hKey)
    BCryptDestroyKey(hKey);
if (hAlgorithm)
    BCryptCloseAlgorithmProvider(hAlgorithm, 0);
person Drake Wu    schedule 17.10.2019