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
謝謝!這似乎工作! –