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

Ruby 为什么在使用私钥加密时不能使用RSA OAEP填充?,ruby,encryption,cryptography,rsa,Ruby,Encryption,Cryptography,Rsa,我正在生成一个许可证密钥有效负载,该有效负载使用RSA使用私钥加密,然后使用公钥解密,以在面向用户的软件中利用许可证有效负载。我加密而不是签名,所以我只需要向我的用户传递一个字符串,而不是传递密钥和签名 但我在使用OAEP填充和私钥加密时遇到问题: require 'openssl' padding = OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING priv = OpenSSL::PKey::RSA.new 2048 pub = priv.public_key

我正在生成一个许可证密钥有效负载,该有效负载使用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
答复:

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


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

是的,这是个坏主意;只有在使用以生成签名为目标的填充方案时,签名生成才被证明是安全的。实际上,PKCS1 v1.5签名生成和加密的填充是不同的,即使它们通常被赋予相同的名称

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

有几种签名生成方法提供ISO 9796指定的消息恢复。这些都有点陈旧和危险,尤其是当攻击者能够以某种方式影响输入消息时。不过,一般来说,它们已经足够了。对于一个真正安全的方案,有[PSS]提供消息恢复,官方称为EMSR-PSS

不幸的是,Ruby似乎无法直接使用这些内容,因此您可能必须实现或链接到填充方案。也就是说,由于OAEP也不可用,这很难取消它们的资格。不过,通常我会选择ECDSA,并将消息与较小的签名格式相结合

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


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

你是说使用私钥的加密实际上不是加密,而是签名,这就是为什么PKCS1_OAEP_填充不可用的原因吗?你怎么能这样说如果是签名,你可以通过公钥解密来恢复明文?为什么不好?是的,我正是这么说的。不仅在这里,而且。除非使用带有消息恢复的方案,否则无法恢复明文。消息恢复本身并不坏;但是,使用错误的填充机制来生成签名是不可能的r bad.OAEP不是为签名生成而设计的。RSA的很多安全性都是从填充中派生出来的;如果消息有任何价值,没有填充的RSA甚至都不是远程安全的。好的,谢谢你的澄清。我不知道。使用PKCS1_填充的RSA私钥加密也是不安全的,还是可以?没有这样的问题s PKCS1填充。它定义了使用RSA的方法。它是RSA实验室的第一个标准,由Rivest、Shamir和Adleman(RSA中的RSA)启动。它定义了多种填充方法,包括用于加密的RSAES-PKCS1-v1_5和用于带有附录的签名方案的RSASSA-PKCS1-v1_5。现在,附录就是消息本身,表明您需要完整的消息来执行签名验证。使用RSAES-PKCS1-v1_5填充来生成签名也不是一个好主意。实际上,正如您可能看到的那样,PSS和OAEP也在PKCS1中定义。如果您指定PKCS1进行加密,则您希望使用RSAES-PKCS1-v1_5,但某些库实际上会部分使用rsasA-PKCS1-v1_5支持一些奇怪的SSL签名方案,该方案同时使用MD5和SHA1连接在一起。