Ошибка импорта открытого ключа RSA с помощью BCryptImportKeyPair - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь использовать Microsofts CNG для проверки подписи в Delphi 2007. Я застрял при импорте открытого ключа с помощью BCryptImportKeyPair.

Я всегда получаю STATUS_INVALID_PARAMETER Ошибка.

Код выглядит следующим образом:

var
   i: Smallint;
   LResult: NTSTATUS;
   LRSA: BCRYPT_ALG_HANDLE;
   LKey: BCRYPT_KEY_HANDLE;
   LRsaKeyBlob: ^BCRYPT_RSAKEY_BLOB;
   LKeyInput: Pointer;
   LKeyCurrent: PByte;
   LKeySize: DWORD;
begin
   LRSA := 0;
   LKey := 0;

   LKeySize := SizeOf(BCRYPT_RSAKEY_BLOB) + 259; // 3 Bytes Exponent + 256 Bytes Modulus
   LKeyInput := GetMemory(LKeySize);
   try
      ZeroMemory(LKeyInput, LKeySize);

      LRsaKeyBlob := LKeyInput;
      LRsaKeyBlob.Magic := BCRYPT_RSAPUBLIC_MAGIC;
      LRsaKeyBlob.BitLength := 2048;
      LRsaKeyBlob.cbPublicExp := 3;
      LRsaKeyBlob.cbModulus := 256;
      LRsaKeyBlob.cbPrime1 := 0;
      LRsaKeyBlob.cbPrime2 := 15;

      LKeyCurrent := PByte(LKeyInput);
      Inc(LKeyCurrent, SizeOf(BCRYPT_RSAKEY_BLOB));
      for i := 0 to 2 do
      begin
         LKeyCurrent^ := CExponent[i];
         Inc(LKeyCurrent);
      end;
      for i := 0 to 255 do
      begin
         LKeyCurrent^ := CModulus[i];
         Inc(LKeyCurrent);
      end;

      LResult := BCryptOpenAlgorithmProvider(LRSA, BCRYPT_RSA_ALGORITHM, nil, 0);
      if not BCRYPT_SUCCESS(LResult) then Exit;
      LResult := BCryptImportKeyPair(LRSA, nil, BCRYPT_RSAPUBLIC_BLOB, LKey, PUCHAR(LKeyInput), LKeySize, 0);
      if not BCRYPT_SUCCESS(LResult) then Exit;

      ShowMessage('Yeah!');
   finally
      FreeMem(LKeyInput);
   end;
end;

Я сгенерировал пару Public / Private-Key в другом приложении (node.js-Backend).

Проблема, я думаю, что модуль может быть неправильным.Я сохранил открытый ключ как PEM-файл и преобразовал его в XML.(Для этого использовал онлайн-сервис) Этот XML-файл прекрасно работает с C # -Test-Application.Затем я преобразовал строки модуля Base64 и Exponent-Strings в HEX-значения и добавил их в качестве констант в мое Delphi-приложение.

...