使用WinAPI实施RSA的问题

问题描述

因此,我在软件(仅用c编写)中从Windows使用CNG框架。 问题是当我尝试在我的代码中实现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_SUPPORTED_PAD_OAEP符号不是变量,它是预处理器宏。

The documentation for BCRYPT_PADDING_SCHEMES说“数据类型是DWORD”,这意味着大小为4个字节。

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

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

从开发者处确认:BCRYPT_PADDING_SCHEMES用于检索RSA算法提供商支持的填充方案。如果要使用一种受支持的填充方案(例如OAEP填充方案),则可以在BCryptEncrypt / BCryptDecrypt中指定BCRYPT_PAD_OAEP标志。