我正在生成一个许可证密钥有效载荷,并使用私钥用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:[email protected];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。
运行它会引发错误:unknown padding type
。使用公钥加密可以使用OAEP,但不能使用私钥。但是,使用PKCS1填充有效。我以为使用PKCS1是不安全的,建议使用OAEP?我希望能够加密相同的有效负载并获得不同的许可证密钥,就像使用OAEP填充一样。
我究竟做错了什么?这是一个坏主意吗?
是的,这是一件坏事。仅当使用针对签名生成的填充方案时,签名生成才被证明是安全的。实际上,即使它们经常使用相同的名称,用于签名生成和加密的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加密是否等同于签名生成的信息,请参阅此处的我自己的自我解答。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句