根据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 加密不同。