Die*_*rik 6 encryption command-line openssl digital-signature public-key
我想“手动”将消息的摘要/散列与该摘要上解密的签名值进行比较。
为此,我想使用属于最初签署摘要的私钥的公钥来解密消息的签名值(签名摘要)。
我有以下物品:
我对如何使用 openssl 实现这一目标感到困惑。
我正在尝试对此处和此处描述的命令进行变体,但是我有点迷失了。
我想我应该使用以下方法将签名从 base64 值转换为八位字节:
base64 --d sigfile > sigfile_octet?
然后我使用命令:
openssl rsautl -inkey pubkey.pem -pubin -in sigfile_octet
这会给我解密的八位字节签名值吗?为了将其与 Base64 摘要进行比较,我需要执行哪些后续步骤?
ps 我已经使用Aleksey 的 XML 安全库验证了签名,所以我知道摘要应该与解密的签名值匹配。
非常感谢您的帮助!
亲切的问候,
迪德里克
使用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,而不是使用该选项,这使您能够从结构中提取元素。
当您说您拥有“摘要上的签名值”时,我假设您拥有的是具有此结构的真实签名,而不仅仅是使用私钥签名的原始哈希。如果不是这种情况,您可以发布一些示例输出。