0

我正在使用用于签署 pdf 文档的智能卡设备。我已经知道如何使用 itext 签署 pdf。

我有一个 20 字节的 sha-1 哈希、256 字节的签名(由智能卡私钥加密的 rsa)和一个公钥(.cer 证书)

有没有办法使用 cryptlib 等免费库在 C 中创建 pkcs#7 二进制对象?

4

1 回答 1

0

您似乎想使用预先计算的签名生成 PKCS#7 / CMS(加密消息语法)签名。

这是 - 令我惊讶 - 可能,但对于一个非常大的IF。该IF是 CMS 消息不包含任何需要签名的附加元数据。用 CMS RFC 的措辞不好的话

...
When the signedAttrs field is absent, only the octets comprising the
value of the SignedData encapContentInfo eContent OCTET STRING (e.g.,
the contents of a file) are input to the message digest calculation.
This has the advantage that the length of the content being signed
need not be known in advance of the signature generation process.
...

您可以使用命令行选项排除signedAtrrs例如OpenSSL 中的内容 -noattr。不幸的是,我没有找到包含签名值本身的直接方法,但这很可能使用 OpenSSL 的 C API 来实现——而且由于 OpenSSL 是开源的,如果它不是,当然可以修改这个问题不。


笔记:

  • 一个好的技巧是在执行 CMS 时使用不同的密钥在零字节值上创建签名,然后查找该值(通过二进制搜索或通过解析 ASN.1 CMS 结构),然后将该签名替换为您的签名'已经产生;
  • CryptLib 和 SHA-1 仅在您计划回到过去时才有用。我强烈建议使用维护良好的库,当然还有安全哈希。
于 2017-06-20T09:40:19.887 回答