在命令行中使用 openssl 使用公钥进行解密

Die*_*rik 6 encryption command-line openssl digital-signature public-key

我想“手动”将消息的摘要/散列与该摘要上解密的签名值进行比较。

为此,我想使用属于最初签署摘要的私钥的公钥来解密消息的签名值(签名摘要)。

我有以下物品:

  • 消息的base64摘要值(使用SHA256计算)
  • 已使用私钥签名的 Base64 摘要上的签名值(使用 SHA256 和 RSA 加密)
  • 属于私钥的 .pem 格式的公钥
  • 我有实际的消息(它是 XML 格式,包含文档不同部分的多个签名)。我已经使用 XML 安全库验证了签名。我只对用公钥解密签名值感兴趣。

我对如何使用 openssl 实现这一目标感到困惑。

我正在尝试对此处和此处描述的命令进行变体,但是我有点迷失了。

我想我应该使用以下方法将签名从 base64 值转换为八位字节:

base64 --d sigfile > sigfile_octet?

然后我使用命令:

openssl rsautl -inkey pubkey.pem -pubin -in sigfile_octet

这会给我解密的八位字节签名值吗?为了将其与 Base64 摘要进行比较,我需要执行哪些后续步骤?

ps 我已经使用Aleksey 的 XML 安全库验证了签名,所以我知道摘要应该与解密的签名值匹配。

非常感谢您的帮助!

亲切的问候,

迪德里克

eri*_*son 5

使用dgst命令,而不是rsautl:

openssl dgst -verify pubkey.pem -signature sigfile_octet message.txt
Run Code Online (Sandbox Code Playgroud)

这message.txt是您尝试验证的消息。


您可以使用rsautl“解密”签名来访问原始验证数据:

openssl rsautl -verify -inkey pubkey.pem -pubin -in sigfile_octet
Run Code Online (Sandbox Code Playgroud)

这将产生签名的 DER 编码 ASN.1 结构。这是一个序列,其中包含所使用的哈希算法的算法标识符,后跟哈希本身。如果您希望 OpenSSL 打印该结构的人类可读视图,您可以将该-asn1parse选项添加到命令中rsautl。看起来像这样:

    0:d=0 hl=2 l= 49 缺点:序列          
    2:d=1 hl=2 l= 13 缺点:序列          
    4:d=2 hl=2 l= 9 prim: 对象:sha256
   15:d=2 hl=2 l= 0 prim: NULL              
   17:d=1 hl=2 l= 32 prim:八位字节字符串      
      0000 - c9 8c 24 b6 77 ef f4 48-60 af ea 6f 49 3b ba ec ..$.w..H`..oI;..
      0010 - 5b b1 c4 cb b2 09 c6 fc-2b bb 47 f6 6f f2 ad 31 [.......+.Go.1

如果您只想提取哈希值,则-asn1parse可以将其通过管道传递给命令asn1parse,而不是使用该选项,这使您能够从结构中提取元素。

当您说您拥有“摘要上的签名值”时,我假设您拥有的是具有此结构的真实签名,而不仅仅是使用私钥签名的原始哈希。如果不是这种情况,您可以发布一些示例输出。