使用创建的证书,我与iTextSharp库签署了PDF文档。
在pdf签名面板中,当我看到公共签名时,我会在hexa中获得以下信息
但是,当我通过c#中的代码从同一证书获得公钥时
var certificate = new X509Certificate2(@"C:\mycert.pfx", "pass");
byte[] publicKey = certificate.PublicKey.EncodedKeyValue.RawData;
以十进制表示的结果(转换为十六进制)是不同的。
例如在字节数组5中,十六进制为130-82,但是在pdf中,第六个密钥为十六进制的0D
我做错了什么?
非常抱歉,我的英语水平。
答案 0 :(得分:1)
就引起差异的原因而言,您的问题是this question的重复项;答案说明:
区别在于Adobe提供了完整
SubjectPublicKeyInfo
对象的十六进制转储(包括算法信息和密钥值的公共密钥),而您的代码仅转储了RSAPublicKey
(密钥本身)...
有关更多详细信息,请阅读此处。
您实际上可以在Adobe Reader输出中识别出纯公共密钥,它从第一行的末尾开始
[...] 30 82 02
0A 02 82 02 01 00 FA 8B ...
但是,解决方案略有不同,因为该问题中的代码是Java。
您的代码使用System.Security.Cryptography.X509Certificates
类X509Certificate2
。 As far as I can see此类本身不会暴露整个SubjectPublicKeyInfo
。因此,您应该在此处使用其他类。
一个显而易见的选择是X509CertificateStructure
或X509CertificateHolder
的BouncyCastle类,具体取决于您使用的BouncyCastle版本(iTextSharp中包含了较旧版本的BouncyCastle,可以从其网络中检索较新的版本。现场)。这些类公开了SubjectPublicKeyInfo
。