当前位置: 首页 > 知识库问答 >
问题:

为什么在使用私钥加密时不能使用RSA OAEP填充?

左丘凡
2023-03-14

我正在生成一个许可证密钥有效载荷,该有效载荷使用私钥用RSA加密,然后使用公钥解密,以在我面向用户的软件中利用许可证有效载荷。我加密而不是签名,所以我只需要向我的用户传递一个字符串,而不是传递密钥和签名。

但我在使用OAEP填充和私钥加密时遇到了问题:

require 'openssl'

padding = OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING
priv = OpenSSL::PKey::RSA.new 2048
pub = priv.public_key

# FIXME: Why can't I use OAEP padding with private key encryption?
data = 'customer:foo@example.com;allowances:25;users:5;locked:true;'
enc = priv.private_encrypt data, padding
dec = pub.public_decrypt enc, padding

puts dec == data

回复:https://repl.it/repls/LavishEarnestWifi.

运行此操作会引发错误:未知填充类型。使用公钥加密允许我使用OAEP,但不允许使用私钥。然而,使用PKCS1填充是可行的。我认为使用PKCS1是不安全的,建议使用OAEP?我希望能够加密相同的负载并获得不同的许可证密钥,就像我能够使用OAEP填充一样。

我做错了什么?这是个坏主意吗?

共有1个答案

鲍理
2023-03-14

是的,这是一件坏事;签名生成只有在使用针对签名生成的填充方案时才被证明是安全的。实际上,用于签名生成和加密的PKCS#1 v1.5填充是不同的,即使它们通常被赋予相同的名称。

您似乎在寻找一个具有(部分)消息恢复的签名方案。这些已经不再经常使用了。其中一个原因是ECDSA签名比RSA签名小得多(ECC密钥大小的两倍,对于非常安全的256位曲线,大约是64字节)。

这里指定了一些提供消息恢复的签名生成方法(ISO 9796)。这些有点旧和危险,尤其是如果攻击者可以以某种方式影响输入消息。不过,通常它们已经足够了。对于真正安全的方案,有[PSS提供消息恢复,官方称为EMSR-PSS,在本文第1.3节中指定:PSS:Bellare和Rogaway的可证明安全的数字签名编码方法。

不幸的是,Ruby似乎无法直接使用这些功能,因此您可能需要实现或链接到填充方案。也就是说,由于OAEP也不可用,这很难取消他们的资格。一般来说,我只会选择ECDSA,并将消息与较小的签名格式相结合。

请注意,私钥操作与RSA公钥操作大不相同。它们通常依赖CRT参数来存在。此外,可能更重要的是,它们需要被设计为保护私钥免受侧通道攻击等攻击。仅仅使用私钥而不是公钥不是一个好主意。

有关使用OAEP生成签名的讨论,请参阅此处的讨论。有关使用私钥进行RSA加密是否等于生成签名的信息,请参阅我自己的自答问答。

 类似资料:
  • 我想使用带有RSA算法的OpenSSL使用私钥加密文件: 现在,如果我执行解密操作: 此操作需要私钥 我知道我应该使用公钥进行加密,如果我使用私钥,我会得到一个签名。 然而,我想这样做是为了学习。

  • 我正在尝试在我的web应用程序中使用小程序来使用智能卡加密一些数据。我正在关注这个链接:http://www.developer.com/java/other/article.php/3587361/Java-Applet-for-Signing-with-a-Smart-Card.htm 我能够读取存储在智能卡中的证书,并使用证书加密数据。但它需要我传递PKCS#11实现库文件(.dll)和智能

  • 我正在使用Maven 3部署到我们的集群。在我的设置中设置了私钥。xml以及pom中的存储库。xml。目前一切正常,除了在我调用时被要求输入密码之外。如果我使用

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我在Java写一个安全的文件共享应用程序。一般的架构是这样的: 用户希望加密文件以在多个用户之间安全共享 应用程序在客户端上生成一个随机UUID,并将其用作AES 256密码,然后使用UUID对数据进行加密 然后使用每个人的公钥对UUID进行RSA加密。每个共享用户一次 每个加密的UUID数据包作为文件的一部分存储在自定义文件头中 然后将文件上载到其他人可以访问的服务器 用户可以使用各自的私钥读取

  • 问题内容: 我有以下查询: 当我这样做时,第一行显示的内容包括: 为什么键为NULL? 问题答案: 可能是因为统计信息已损坏,或者是因为它知道两个表之间始终具有1:1的比率。 您可以强制在查询中使用索引,并查看这样做是否可以加快速度。如果是这样,请尝试运行ANALYZE TABLE以确保统计信息是最新的。 通过指定USE INDEX(index_list),可以告诉MySQL仅使用命名索引之一来查