2009-10-23 97 views
5

OpenSSL以及大多數其他DSA實現以ASN.1格式輸出簽名。因此,由於ASN.1結構頭部,40字節簽名(兩個20字節整數)變爲46字節。 (有關詳細信息,請參見this forum post)。如何使用BouncyCastle(C#)以ASN.1格式導入DSA簽名

我的問題是,如何在C#中處理此格式?(或其他地方,對這個問題)

我花了試圖使用.NET System.Security.Crypto包來對付它,而放棄了對(很無奈,因爲它顯然有內部代碼來解析ASN.1因爲它可以讀取DER格式,但沒有辦法讓你使用它 - 但我離題...

然後,我開始使用BouncyCastle C#庫。我可以把它變成一個Asn1Object,如果我展開它在調試時我看到它包含兩個整數一個DerSequence,但我怎麼拉出來(最好爲BigIntegers,所以我可以餵它們DSA.VerifySignature?)

代碼示例:

Byte[] msgText = ReadFile("test_msg.txt"); 
Byte[] msgSigRaw = ReadFile("test_sig_1.bin"); // reads binary ASN.1 sig using FileStream 
Asn1Object sigASN = Asn1Object.FromByteArray(msgSigRaw); // parses into Asn1Object 
... 
X509Certificate implCert = ReadCertificate("pubcert_dsa.cer"); // cert in DER format 
DsaSigner DSA = new DsaSigner(); 
DSA.Init(false, implCert.GetPublicKey()); 
... 
BigInteger sigIntR, sigIntS; 
... //TODO: how to get signature from sigASN into sigIntR, sigIntS? 
Boolean validSig = DSA.VerifySignature(msgText, sigIntR, sigIntS); // my goal 

回答

2

如何驗證BouncyCastle的C#中的DSA簽名一些示例代碼:

ISigner sig = SignerUtilities.GetSigner("SHA1withDSA"); 
sig.Init(false, implCert.GetPublicKey()); 
sig.BlockUpdate(msgText, 0, msgText.Length); 
bool valid = sig.VerifySignature(msgSigRaw); 

注意這個簽名者將處理ASN.1和消息摘要的計算(我認爲SHA- 1在這裏使用)爲你。

如果您仍然確實想知道{r,s}值從ASN.1轉換到/來自ASN.1的轉換髮生,請查看DsaDigestSigner的源代碼。它在內部進行適當的ASN.1編碼/解碼,然後使用DsaSigner類進行低級sig操作。

+0

謝謝!這似乎工作! –

相關問題