根据docs for OpenSSL,RSA_PKCS1_PSS_PADDING
应该可以与OpenSSL的RSA_private_encrypt
函数一起使用,这是Ruby在OpenSSL::PKey::RSA#private_encrypt
内部使用的功能。
链接文档中有关OpenSSL的RSA_private_encrypt
的相关报价:
padding参数必须是
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
即使我认为OpenSSL支持unknown padding type
填充类型,运行此方法也会引发错误:RSA_PKCS1_PSS_PADDING
。
Ruby 2.5是否出于某些原因不支持RSA_PKCS1_PSS_PADDING
?
答案 0 :(得分:1)
您引用的文档中提到
RSA_PKCS1_PSS_PADDING
只能通过EVP界面使用。
您调用的Ruby函数在幕后使用RSA_private_encrypt()
函数,而不是EVP接口。结果,OpenSSL发出错误。您可以在OpenSSL源代码here中看到它的发生。
但是,Ruby的OpenSSL::PKey::RSA
class公开了两种专门用于通过RSA-PSS方案进行签名和验证的方法,称为sign_pss()
和verify_pss()
。他们的文档带有编码示例,向您展示如何使用它们。
RSA-PSS仅可用于签名生成(和验证)which is not the same as RSA encryption with a private key (and decryption with a public key)。