如何将PKCS1_PSS_PADDING与 Ruby 的 RSA 实现一起使用?



根据OpenSSL的文档,RSA_PKCS1_PSS_PADDING应该可以与OpenSSL的RSA_private_encrypt函数一起使用,这是Ruby内部用于OpenSSL::PKey::RSA#private_encrypt的功能。

OpenSSLRSA_private_encrypt链接文档中的相关引述:

填充参数必须是RSA_*_PADDING值之一。如果有疑问,RSA_PKCS1_PADDING是最常见的,但RSA_PKCS1_PSS_PADDING是新协议的首选。

无论如何,我可以使用 PSS 填充进行私钥加密吗?我更喜欢使用 PSS 而不是 Ruby 的默认填充(OpenSSL 文档说它更可取(,但似乎 PSS 没有广泛实现,除非我误解了事情。

我安装了Ruby 2.5和OpenSSL 1.0.2。

require 'openssl'
padding = 6 # OpenSSL's raw constant for RSA_PKCS1_PSS_PADDING since Ruby doesn't define it
priv = OpenSSL::PKey::RSA.new 2048
pub = priv.public_key
data = 'foo-bar-baz'
enc = priv.private_encrypt data, padding
dec = pub.public_decrypt enc, padding
puts dec == data

运行它会抛出一个错误:unknown padding type,即使我认为 OpenSSL 支持RSA_PKCS1_PSS_PADDING填充类型。

Ruby 2.5 是否出于某种原因不支持RSA_PKCS1_PSS_PADDING

您引用的文档提到

RSA_PKCS1_PSS_PADDING只能通过 EVP 接口使用。

您调用的 Ruby 函数使用引擎盖下的RSA_private_encrypt()函数,该函数不是 EVP 接口。因此,OpenSSL 会发出错误。你可以在这里的OpenSSL源代码中看到它。

但是,Ruby 的OpenSSL::PKey::RSA类公开了两个专门用于使用 RSA-PSS 方案进行签名和验证的方法,称为sign_pss()verify_pss()。他们的文档附带编码示例,向您展示如何使用它们。

RSA-PSS 只能用于签名生成(和验证(,这与使用私钥(以及使用公钥解密(的 RSA 加密不同。

最新更新