如何在Ruby的RSA实现中使用PKCS1_PSS_PADDING?

时间:2018-08-20 21:03:56

标签: ruby openssl rsa

根据docs for OpenSSLRSA_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

1 个答案:

答案 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)