我正在尝试使用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中。