签署pdf文件时,为什么PFX的公钥不同?

时间:2019-10-10 13:20:26

标签: c# pdf itext public-key pfx

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

在pdf签名面板中,当我看到公共签名时,我会在hexa中获得以下信息

pdf public key

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

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

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

例如在字节数组5中,十六进制为130-82,但是在pdf中,第六个密钥为十六进制的0D

pdf public key

我做错了什么?

非常抱歉,我的英语水平。

1 个答案:

答案 0 :(得分:1)

就引起差异的原因而言,您的问题是this question的重复项;答案说明:

  

区别在于Adobe提供了完整SubjectPublicKeyInfo对象的十六进制转储(包括算法信息和密钥值的公共密钥),而您的代码仅转储了RSAPublicKey(密钥本身)

     

...

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

您实际上可以在Adobe Reader输出中识别出纯公共密钥,它从第一行的末尾开始

  

[...] 30 82 02

     

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


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

您的代码使用System.Security.Cryptography.X509CertificatesX509Certificate2As far as I can see此类本身不会暴露整个SubjectPublicKeyInfo。因此,您应该在此处使用其他类。

一个显而易见的选择是X509CertificateStructureX509CertificateHolder的BouncyCastle类,具体取决于您使用的BouncyCastle版本(iTextSharp中包含了较旧版本的BouncyCastle,可以从其网络中检索较新的版本。现场)。这些类公开了SubjectPublicKeyInfo