openssl - 如何使用openssl从签名中打印出原始填充哈希
问题描述
我想在签署文件时了解不同的填充和标识符或格式。所以我想知道使用 openssl 时会发生什么
例如:
openssl dgst -sha256 -sign xiaomi_rootca.key -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:-1 -out sig.bin 1.txt
它肯定会生成一个sig.bin
. 但是我想知道 opensslhash.bin
在转换为之前做了什么sig.bin
所以让我们把这个过程分成几个步骤:
openssl dgst -binary -sha256 -out hash.bin 1.txt
- 填充它
- 也许添加一些标识符,如 rfc3447.txt 第 12 页说的?并生成最终文件
final_hash.bin
- 原始标志。
openssl rsautl -sign -inkey private.key -in fianl_hash.bin -out sig.bin
好吧,我想知道在第 2 步和第 3 步中到底发生了什么。那么有没有任何命令可以反转第 4 步?
在我可以使用之前openssl rsautl -verify
,它不支持 pss 填充。
解决方案
我不认为你可以像你一样把它分开。
当您执行仅摘要命令时,您使用EVP_DigestInit API。当您使用 -sign 选项时,它使用EVP_DigestSignInit API。
所以我认为这比你分解的要复杂一些。现在要真正区分,您必须开始研究引擎代码,特别是私钥类型的实现(例如 RSA、EC 等)。
查看 RSA PSS 引擎实现,看起来填充是与签名操作本身内联实现的。
例如,在 pkey_rsa_sign 函数中,您会看到如下代码:
} else if (rctx->pad_mode == RSA_PKCS1_PSS_PADDING) {
if (!setup_tbuf(rctx, ctx))
return -1;
if (!RSA_padding_add_PKCS1_PSS_mgf1(rsa,
rctx->tbuf, tbs,
rctx->md, rctx->mgf1md,
rctx->saltlen))
return -1;
如果您想验证摘要,您似乎真的想使用EVP_DigestVerifyInit API(因为这是 dgst 命令正在使用的),因为我不确定您是否会沿着您想要的路径到达任何地方在你的问题中。
推荐阅读
- swift - Swift JSONSerialization 作为 Int 而不是 Double
- c# - SignalR .NET 客户端连接到 Blazor .NET Core 3 应用程序中的 Azure SignalR 服务
- hyperledger-fabric - 无法通过 Hyperledger Fabric 1.4.3 使用 Java 链码编写您的第一个应用程序教程
- python - python中的硒。试图选择元素
- javascript - 是否可以创建一个简单的解析器并创建一个 javascript 文件,然后使用该解析器调用该文件?
- reactjs - 创建一个反应应用程序开始中止安装
- python - 查找 Python3 安装位置
- python - 如何将多个 .mat 文件加载到 python 脚本中
- c - 用于图像过滤的卷积
- node.js - 使用 nodejs 的 Firebase 登录不会持续存在