2014-02-10 112 views
0

我正在用c#中的自签名X509Certificate签署一些数据。签名结果为二进制byte[]。我想将此签名保存为pkcs#7格式文件,其扩展名为.p7b。当我根据需要使用FileStream保存该文件时。它会生成一个无效的p7b文件。x509Certificate - 以pkcs#7格式保存二进制签名(.net c#)

任何人都可以将此签名保存为有效的外部文件吗?或者指出该方法是否有问题?

//编辑:添加代码询问由Eugene Mayevski

// Open Store Location & fetch certificate 
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadWrite); 
X509Certificate2Collection certifcates = store.Certificates; 
X509Certificate2 certificate = certifcates[0];` 

// fetch private key 
string publicKeyString = certificate.GetPublicKeyString(); 
RSACryptoServiceProvider privateKey = certificate.PrivateKey as RSACryptoServiceProvider; 

// get binary of data & sign it. 
byte[] buffer = Encoding.Default.GetBytes("Sample data to sign. Although it would be a document."); 
byte[] signature = privateKey.SignData(buffer, new SHA1Managed()); 
+0

你看看http://msdn.microsoft.com/en-us/library/ms180948%28v=vs.85%29.aspx? 你不想存储证书,但签名,对吧? – BatteryBackupUnit

+0

是的,我需要自己存储签名。我已经浏览了您提供的链接。我认为这些功能封装在.net 4.0中,因为命名空间System.Security.Cryptography.pkcs不可用。无论如何,数据正在签署和验证。唯一我想要的是将Signature以适当的文件格式存储。 – Ram

+0

很高兴看到您首先使用的代码创建签名。这可能是因为您实际上没有创建PKCS#7签名,因此存在问题。 –

回答

0

您还没有生成,其在PKCS#7中定义的加密消息语法(CMS)的消息格式。您只生成签名,该签名可以放在容器格式中。

要自己创建CMS格式的消息,请查看Microsoft documentation或使用C# version of Bouncy Castle

+0

感谢您澄清。在深入研究密码学之后,我可以消化这些东西(正如我刚才所说的那样)。在文档链接中指出的API也有点令人困惑,因为它显示.net版本高达3.0,并且这些类在添加安全dll之前不可访问。因此感觉它已经过时了。 @BatteryBackupUnit由于这个原因,我没有理解你的评论。 – Ram