我想了解对文件签名时使用的不同填充和标识符或格式。所以我想知道使用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
因此,我们将这个过程分为几个步骤:
openssl dgst -binary -sha256 -out hash.bin 1.txt
final_hash.bin
openssl rsautl -sign -inkey private.key -in fianl_hash.bin -out sig.bin
好吧,我想知道在第2步和第3步中到底发生了什么。那么是否有任何命令可以逆转第4步?
在我可以使用openssl rsautl -verify
之前,但是它不支持pss填充。
答案 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),因为我不确定您会遇到什么麻烦您想在问题中走的路径。