使用 WinAPI 实现 RSA 的问题

Problem with RSA implementation with WinAPI

所以我在我的软件中使用了 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 return 出现无效句柄错误。

一个问题是 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 标志