使用BCryptImportKeyPair导入RSA公钥时出错

时间:2019-02-22 13:15:28

标签: delphi rsa public-key delphi-2007 cng

我正在尝试使用Microsoft的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;

我在另一个应用程序(node.js-Backend)中生成了公钥/私钥对。

我认为的问题是,模量可能不正确。我将公钥另存为PEM文件,并将其转换为XML。 (为此使用了在线服务)此XML文件可与C#-Test-Application完美配合使用。然后,我将Base64模数和指数字符串转换为HEX值,并将它们作为常量添加到我的Delphi-App中。

0 个答案:

没有答案