1

使用我创建的证书,我使用 iTextSharp 库签署了一个 PDF 文档。

什么时候,在 pdf 签名面板中,我会看到公共签名我有以下 hexa 信息

pdf公钥

但是,当我通过我在 c# 中的代码从同一个证书中获取公钥时

    var certificate = new X509Certificate2(@"C:\mycert.pfx", "pass");
    byte[] publicKey = certificate.PublicKey.EncodedKeyValue.RawData;

十进制(转换为十六进制)的结果是不同的。

例如,在字节数组中 5 在 Hexa 中是 130 - 82,但在 pdf 中,第 6 个键在 hexa 中是 0D

pdf公钥

我做错了什么?

谢谢和对不起我的英语。

4

1 回答 1

1

就差异的原因而言,您的问题与此问题重复;答案解释:

不同之处在于 Adob​​e 提供完整SubjectPublicKeyInfo对象的十六进制转储(包括算法信息和密钥值的公钥),而您的代码仅转储RSAPublicKey(密钥本身)。

...

有关更多详细信息,请阅读此处。

您实际上可以识别 Adob​​e Reader 输出中的普通公钥,它从第一行的末尾开始,

[...] 30 82 02

0A 02 82 02 01 00 FA 8B ...


不过,解决方案略有不同,因为该问题中的代码是用 Java 编写的。

您的代码使用System.Security.Cryptography.X509CertificatesX509Certificate2据我所知,这个类本身并没有暴露整体SubjectPublicKeyInfo。因此,您应该在这里使用不同的类。

一个明显的选择是 BouncyCastle 类,或者X509CertificateStructureX509CertificateHolder,这取决于您使用的 BouncyCastle 版本(iTextSharp 中包含 BouncyCastle 的旧版本,可以从他们的网站检索新版本)。这些类公开了SubjectPublicKeyInfo.

于 2019-10-10T15:47:16.937 回答