首页 > 解决方案 > 如何在 Ruby 的 RSA 实现中使用 PKCS1_PSS_PADDING?

问题描述

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

来自 OpenSSL 的链接文档的相关引用RSA_private_encrypt

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

无论如何我可以使用 PSS 填充进行私钥加密吗?我更喜欢在 Ruby 的默认填充上使用 PSS(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填充类型。

RSA_PKCS1_PSS_PADDINGRuby 2.5出于某种原因不支持吗?

标签: rubyopensslrsa

解决方案


您提到的文档提到

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 加密(和使用公钥的解密)不同


推荐阅读