ruby - 如何在 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_PADDING
Ruby 2.5出于某种原因不支持吗?
解决方案
您提到的文档提到
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 加密(和使用公钥的解密)不同。
推荐阅读
- android - 编译 Flutter 时出现“任务 ':app:packageDebug' 执行失败 > 无法生成 v1 签名”异常
- swift - 在 SwiftUI 中不断重复动作
- javascript - 如何在 Chart.js 的工具提示中键入字符串?
- sass - 不兼容的单位:'rem' 和 'px' - Bootstrap 4.3.1
- python - 退出代码 0,无错误,无输出
- sql - 如何从周期列中选择值作为行?
- reactjs - 使用 redux-observable 调度多个操作
- r - R 包失败 devtools::check,因为“找不到函数”,即使该函数已导入 NAMESPACE
- php - 如何在 google oauth 2.0 中强制要求所有范围?
- angular - 从可发布的 Angular 库访问环境设置