如何使用OpenSSL从签名中打印出原始的填充哈希

时间:2019-05-27 11:54:09

标签: 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。但是我想知道openssl对hash.bin做了什么,然后才转换为sig.bin

因此,我们将这个过程分为几个步骤:

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为您无法像以往一样将其拆分。

在执行仅摘要命令时,请使用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命令正在使用该API),因为我不确定您会遇到什么麻烦您想在问题中走的路径。