问题描述
因此,我在软件(仅用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
标志。