2016-01-30 103 views
1

我開始進行密碼學了。 我需要使用XML,RSA私鑰(證書中未包含擴展名爲.key的文件)和證書.cer擴展名生成PKCS#7文件。在C#中用BouncyCastle生成一個CMS PKCS#7文件

爲此,我使用了BouncyCastle。

編輯:

感謝@khlr您的幫助,但我解決不了我的問題。將數據發送給AC時,會返回「無效的CMS」。 我有這樣的代碼:

public static byte[] FirmaBytesMensaje(byte[] argBytesMsg, X509Certificate2 argCertFirmante) 
{ 
    try 
    { 
     //Add message in object ContentInfo 
     ContentInfo infoContenido = new ContentInfo(argBytesMsg); 
     SignedCms cmsFirmado = new SignedCms(infoContenido); 


     CmsSigner cmsFirmante = new CmsSigner(argCertFirmante); 
     cmsFirmante.IncludeOption = X509IncludeOption.EndCertOnly; 


     // Sign message PKCS #7 
     cmsFirmado.ComputeSignature(cmsFirmante); 


     // Encodeo el mensaje PKCS #7. 
     return cmsFirmado.Encode(); 
    } 
    catch (Exception excepcionAlFirmar) 
    { 
     throw new Exception("***Error: " + excepcionAlFirmar.Message); 
    } 
} 

上簽名PKCS#7,但是這使得以「PFX」證書,也就是說,包含在「.PFX」文件中的私鑰。 當我使用OpenSSL命令時:

openssl smime -sign -signer cert.crt -inkey private.key -out file.xml.cms -in file.xml -outform PEM -nodetach 

AC響應良好。 我怎麼能用BouncyCastle和cer和密鑰文件做到這一點?我快瘋了! :-(

+0

您的實際問題是......? – khlr

+0

嗨! @khlr我的問題是我無法創建包含以下內容的CMS文件:--- BEGIN PKCS#7 --- .......................... .................... --- END PKCS#7 --- – Emily

+0

那麼,你有沒有得到任何例外,或只是你得到的不同的輸出你在期待什麼? – khlr

回答

0

遺憾的是似乎有no bouncycastle API documentation for C#。從來沒有少還有一個Java reference這被認爲是相當類似於C#API。

因此,getEncoded() - 方法(尋找一個C#相當於,例如GetEncoded() )產生一個ASN.1編碼byte[]

然後,您可以繼續前進,從那個(請注意,我不熟悉ASN.1編碼字符串這只是一個猜測):

byte[] buffer = datosFirmados.GetEncoded(); 
string signedDataString = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length); 

編輯:

也許AsnEncodedData-class會更適合這一任務:

byte[] buffer = datosFirmados.GetEncoded(); 
var asndata = new AsnEncodedData(buffer); 
const bool multiline = true; 
string signedDataString = asndata.Format(multiline); 
+0

Thaks爲您提供幫助@khlr,但我無法解決我的問題。我再次編輯我的帖子。 – Emily