【问题标题】:Problem with RSA implementation with WinAPI使用 WinAPI 实现 RSA 的问题
【发布时间】:2020-09-24 01:48:03
【问题描述】:

所以我在我的软件中使用来自 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 返回无效句柄错误。

【问题讨论】:

  • 根据评论,BCRYPT_PADDING_SCHEMES 似乎是BCryptGetProperty。你有没有在内核模式下试过,用BCRYPT_PROV_DISPATCH打开provider句柄?

标签: c windows winapi bcrypt


【解决方案1】:

一个问题是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 );

【讨论】:

  • 首先感谢您的回复。不幸的是,该函数仍然返回 INVALID_HANDLE
  • @TheAsker 是的,这就是我从“一个问题是”开始的原因 :-) 不幸的是,您发布的代码并没有说明完整的故事,即您如何初始化您的 PointerToAlgorithmProvider 和 @ 987654328@ 变量。
  • 我编辑了,希望它能更清楚地说明情况
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2019-05-07
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多