首页 > 解决方案 > 如何使用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

所以让我们把这个过程分成几个步骤:

  1. openssl dgst -binary -sha256 -out hash.bin 1.txt
  2. 填充它
  3. 也许添加一些标识符,如 rfc3447.txt 第 12 页说的?并生成最终文件final_hash.bin
  4. 原始标志。openssl rsautl -sign -inkey private.key -in fianl_hash.bin -out sig.bin

好吧,我想知道在第 2 步和第 3 步中到底发生了什么。那么有没有任何命令可以反转第 4 步?

在我可以使用之前openssl rsautl -verify,它不支持 pss 填充。

标签: openssl

解决方案


我不认为你可以像你一样把它分开。

当您执行仅摘要命令时,您使用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 命令正在使用的),因为我不确定您是否会沿着您想要的路径到达任何地方在你的问题中。


推荐阅读