Cryptography crypto api-块模式加密确定输入字节计数

Cryptography crypto api-块模式加密确定输入字节计数,cryptography,Cryptography,我正在尝试使用一个公钥加密某个日期,该公钥派生自使用CALG_RSA_KEYX密钥类型生成的交换密钥对。我使用cryptgetkeyparam KP_BLOCKLEN确定块大小为512位。这似乎是我可以输入cryptencrypt的最大字节数,53个字节(424位),我得到的加密长度是64。如何确定可以将多少字节送入cryptencrypt?如果输入超过53个字节,调用将失败。编辑:尽管此响应被OP标记为已接受,请参阅Rasmus Faber响应,因为这是一个更好的响应。24小时后发布,Rasm

我正在尝试使用一个公钥加密某个日期,该公钥派生自使用CALG_RSA_KEYX密钥类型生成的交换密钥对。我使用cryptgetkeyparam KP_BLOCKLEN确定块大小为512位。这似乎是我可以输入cryptencrypt的最大字节数,53个字节(424位),我得到的加密长度是64。如何确定可以将多少字节送入cryptencrypt?如果输入超过53个字节,调用将失败。

编辑:尽管此响应被OP标记为已接受,请参阅Rasmus Faber响应,因为这是一个更好的响应。24小时后发布,Rasmus的回复纠正了事实错误,特别是错误地将OAEP描述为分组密码;OAEP实际上是PKCS-1编码原语之上用于密钥加密的方案。OAEP更安全,并且对最大消息长度设置了更大的限制,该限制还绑定到哈希算法及其密钥长度

以下答复的另一个缺点是没有强调CALG_RSA_KEYX应专门用于密钥交换
,之后可以使用所需的任何对称密钥加密算法传输任何长度的消息。OP意识到了这一点,他只是想“玩”PK,而我确实涵盖了很多内容,尽管是在长篇大论中

在此之前,我将把这个回答留在这里,以供记录在案,同时也是迈克·D可能想提及的,但如果你认为最好把它全部删除,请务必在这里评论我;为了清楚起见,我不介意这样做!
-mjv-2009年9月29日

原始回复:

在cryptencrypt()返回错误后,您是否检查了GetLastError()中的错误代码? 我怀疑可能是NTE_BAD_LEN,除非有其他问题

也许您可以发布围绕调用scriptencryt()的代码

当看到CryptEncrypt()调用时,Bingo

您似乎没有使用RSAES w/OAEP方案,因为您没有启用CRYPT_OAEP标志。该OAEP方案是基于RSAE的分组密码。但是,后一种加密算法只能加密略小于其密钥大小(以字节表示)的消息。这是由于PKCS#1中定义的最小填充大小;这种填充有助于保护算法免受一些关键攻击(我认为是基于已知明文的攻击)

因此,您有三种选择:

  • 在Flag参数中使用CRYPT_OAEP来加密()
  • 将密钥大小扩展到1024(如果您可以控制它,请注意较长的密钥将增加编码/解码的时间…)
  • 限制自己清除短于54字节的文本消息
出于文档的目的,我想记录一些在线资源

- The [RSA Labs][1] web site which is very useful in all things crypto. - Wikipedia articles on the subject are also quite informative, easier to read and yet quite factual (I think). -[RSA Labs][1]网站在所有加密方面都非常有用。 -维基百科关于这一主题的文章也相当翔实,更容易阅读 但我认为这是事实。
但是,如果有疑问,请咨询真正的密码专家,而不是像我这样的人:-)

编辑:尽管此响应被OP标记为接受,请查看Rasmus Faber响应,因为这是一个更好的响应。24小时后发布,Rasmus的回复纠正了事实错误,特别是错误地将OAEP描述为分组密码;OAEP实际上是PKCS-1编码原语之上用于密钥加密的方案。OAEP更安全,并且对最大消息长度设置了更大的限制,该限制还绑定到哈希算法及其密钥长度

以下答复的另一个缺点是没有强调CALG_RSA_KEYX应专门用于密钥交换
,之后可以使用所需的任何对称密钥加密算法传输任何长度的消息。OP意识到了这一点,他只是想“玩”PK,而我确实涵盖了很多内容,尽管是在长篇大论中

在此之前,我将把这个回答留在这里,以供记录在案,同时也是迈克·D可能想提及的,但如果你认为最好把它全部删除,请务必在这里评论我;为了清楚起见,我不介意这样做!
-mjv-2009年9月29日

原始回复:

在cryptencrypt()返回错误后,您是否检查了GetLastError()中的错误代码? 我怀疑可能是NTE_BAD_LEN,除非有其他问题

也许您可以发布围绕调用scriptencryt()的代码

当看到CryptEncrypt()调用时,Bingo

您似乎没有使用RSAES w/OAEP方案,因为您没有启用CRYPT_OAEP标志。该OAEP方案是基于RSAE的分组密码。但是,后一种加密算法只能加密略小于其密钥大小(以字节表示)的消息。这是由于PKCS#1中定义的最小填充大小;这种填充有助于保护算法免受一些关键攻击(我认为是基于已知明文的攻击)

因此,您有三种选择:

  • 在Flag参数中使用CRYPT_OAEP来加密()
  • 将密钥大小扩展到1024(如果您可以控制它,请注意较长的密钥将增加编码/解码的时间…)
  • 限制自己清除短于54字节的文本消息
出于文档的目的,我想记录一些在线资源

- The [RSA Labs][1] web site which is very useful in all things crypto. - Wikipedia articles on the subject are also quite informative, easier to read and yet quite factual (I think). -[RSA Labs][1]网站在所有加密方面都非常有用。 -维基百科关于这一主题的文章也相当翔实,更容易阅读 但我认为这是事实。 然而,当有疑问时,请咨询真实的