gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:35:23 25 4
gpt4 key购买 nike

我正在生成一个许可证 key 负载,该负载使用私钥通过 RSA 加密,然后使用公钥对其进行解密,以便在我面向用户的软件中使用许可证负载。我正在加密而不是签名,所以我只需要向我的用户提供一个字符串,而不是提供 key 和签名。

但是我在使用带有私钥加密的 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?我希望能够加密相同的有效负载并获得不同的许可证 key ,就像我能够使用 OAEP 填充一样。

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

最佳答案

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

您似乎正在寻找的是具有(部分)消息恢复功能的签名方案。那些不再经常使用了。原因之一是因为 ECDSA 签名比 RSA 签名小得多(是 ECC key 大小的两倍,对于非常安全的 256 位曲线来说大约是 64 字节)。


有一些签名生成方法可以指定消息恢复 here (ISO 9796)。这些有点陈旧和危险,特别是如果攻击者可以以某种方式影响输入消息。一般来说,它们就足够了。对于真正安全的方案,有 [PSS 提供消息恢复,正式称为 EMSR-PSS,指定 in section 1.3 of the paper: PSS: Provably secure encoding method for digital signatures by Bellare and Rogaway .

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


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

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

关于ruby - 为什么我在使用私钥加密时不能使用 RSA OAEP 填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com