C 使用WinAPI实现RSA时出现问题

C 使用WinAPI实现RSA时出现问题,c,windows,winapi,bcrypt,C,Windows,Winapi,Bcrypt,因此,我在我的软件中使用了来自windows的CNG框架(专门用c编写)。 问题是当我试图在代码中实现RSA时 代码如下所示: DWORD temp = BCRYPT_SUPPORTED_PAD_OAEP; BCryptOpenAlgorithmProvider(PointerToAlgorithmProvider, BCRYPT_RSA_ALGORITHM, NULL, 0); BCryptGenerateKeyPair(ActualAlgorithmPro

因此,我在我的软件中使用了来自windows的CNG框架(专门用c编写)。 问题是当我试图在代码中实现RSA时

代码如下所示:

    DWORD temp = BCRYPT_SUPPORTED_PAD_OAEP;

    BCryptOpenAlgorithmProvider(PointerToAlgorithmProvider, BCRYPT_RSA_ALGORITHM, NULL, 0);
    
    BCryptGenerateKeyPair(ActualAlgorithmProvider, &handleToKeyObject, 2048, 0);
    
    BCryptSetProperty(ActualAlgorithmProvider, BCRYPT_PADDING_SCHEMES, (PUCHAR)&temp, sizeof(DWORD), 0);

.
.
.

不幸的是,
BCryptSetProperty
返回时出现无效句柄错误。

一个问题是
BCryptSetProperty
的使用不正确。
BCRYPT\u SUPPORTED\u PAD\u OAEP
符号不是一个变量,它是一个预处理器宏

对于
BCRYPT\u PADDING\u方案
说“数据类型是DWORD”,这意味着大小是4字节

要设置该属性,请声明一个本地
DWORD
变量并将地址传递给函数:

DWORD val = BCRYPT_SUPPORTED_PAD_OAEP;
BCryptSetProperty( ActualAlgorithmProvider, BCRYPT_PADDING_SCHEMES, (PUCHAR)(&val), 4, 0 );

开发者确认:
BCRYPT\u PADDING\u SCHEMES
用于检索RSA算法提供程序支持的填充方案。如果要使用受支持的填充方案之一(例如OAEP填充方案),可以在/

中指定
BCRYPT\u PAD\u OAEP
标志。首先,感谢您的回复。不幸的是,该函数仍然返回无效_HANDLE@TheAsker是的,这就是为什么我从“一个问题是”:-)不幸的是,你发布的代码没有说明全部情况,即你如何初始化你的
PointerToAlgorithmProvider
ActualAlgorithmProvider
变量,希望它能对这种情况有更多的了解。根据评论,这似乎是针对
BCryptGetProperty
。您是否在内核模式下尝试过,用
BCRYPT\u PROV\u DISPATCH
打开提供程序句柄?