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

JamieCoder

我正在生成一个许可证密钥有效载荷,并使用私钥用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用RSA-OAEP解密用JavaScript加密的C#中的数据时,OAEP填充错误

C#:解码OAEP填充奇怪的问题时出错

解密使用 openssl、oaep 填充模式加密的非对称密钥

我可以使用4096位作为带有OAEP填充的Java RSA的密钥长度吗?

在用GO语言加密的同时,如何在c#中解密RSA加密字符串。解码OAEP填充时发生错误

使用RSA OAEP加密和解密

为什么WebCryptoAPI RSA-OAEP加密功能无法在给定密钥大小下使用预期的最大块大小?

使用范围函数填充列表时,为什么用%d打印时出现列表格式错误?

RSA OAEP,Golang解密,Java加密

无法使用SubtleCrypto Web Crypto API解密用PyCryptodome加密的RSA-OAEP消息

Java 和 JavaScript 之间使用 OAEP 的 RSA 加密

使用SHA-1时,使用SHA-256进行RSA OAEP加密失败

为什么不能使QML RowLayout填充ColumnLayout的宽度?

为什么我在使用任务时收集不能正确填充?

扑:为什么我不能使用最终成员字段作为小部件的填充?

为什么用相同的数据填充RecyclerView行?

为什么用dtype = str的空DataFrame填充“ n”?

不能使用调色板用颜色填充对象

RSA OAEP,Golang加密,Java Decrypt -BadPaddingException:解密错误

为什么我不能使用eslint-config-rallycoding npm包来填充我的create-react-app项目?

使用node-forge进行加密,并使用python和RSA-OAEP进行解密

[Nodejs-加密] [JSencrypt] rsa例程:RSA_padding_check_PKCS1_OAEP_mgf1:oaep解码错误

使用Java在RSA-OAEP加密中为标签提供价值

使用弹性城堡和python PKCS1-OAEP的Java RSA加密

使用SHA-256AndMGF1Padding Swift加密RSA / ECB / OAEP

如何在Crypto ++中使用RSA OAEP SHA-256加密/解密数据

如果只有公钥,如何使用RSA / OAEP进行加密/解密

JavaScript导出RSA-OAEP公钥

不能使用 memcpy 填充 Struct