在前一篇文章:.NET(C#):RSA的SignHash和VerifyHash,我講到使用RSA的SignHash和VerifyHash可以同樣做到SignData和VerifyData,事實上還有一種方法進行公開金鑰加密的簽名認證。就是.NET中的AsymmetricSignatureFormatter和AsymmetricSignatureDeformatter。直接翻譯就是“不對稱式加密簽名格式化器和反格式化器”。分明用來進行建立簽名和驗證簽名的。
他們都需要操作一個不對稱式加密類型(即公開金鑰加密類型:.NET中的AsymmetricAlgorithm類型)。為了設定這個類型,需要使用SetKey和SetHashAlgorithm來分別設定公開金鑰加密的密鑰和用來計算簽名的雜湊演算法。其實由於AsymmetricAlgorithm類並沒有像SymmetricAlgorithm那樣有Key屬性。SetKey的執行往往是直接把一個AsymmetricAlgorithm對象賦值到Formatter或者Deformatter內的一個欄位。
設定好對應的公開金鑰加密對象和雜湊演算法後,就可以使用CreateSignature或者VerifySignature來建立或者驗證簽名了。
當前.NET Framework(.NET 4)中有針對RSA的RSAPKCS1Signature(Formatter和Deformatter),和針對DSA的DSASignature(Formatter和Deformatter)類型。
注意SetHashAlgorithm方法參數不需要是OID形式,而SignHash/VerifyHash方法則需要OID。
看代碼(用RSA做樣本):用用AsymmetricSignatureFormatter類和AsymmetricSignatureDeformatter類和SignHash以及VerifyHash作比較。兩者都輸出同樣的結果。
//+ using using System.Security.Cryptography
//建立RSA和SHA1
using (var rsa = new RSACryptoServiceProvider())
using (var sha = SHA1.Create())
{
//資料雜湊值
var hash = sha.ComputeHash(new byte[] { 1, 2, 3 });
//建立SHA1的OID
var oid = new Oid("SHA1");
//使用SignHash
var sig1 = rsa.SignHash(hash, oid.FriendlyName);
//輸出1
Console.WriteLine(BitConverter.ToString(sig1));
//使用AsymmetricSignatureFormatter(RSAPKCS1SignatureFormatter).CreateSignature
var fmt = new RSAPKCS1SignatureFormatter();
fmt.SetKey(rsa);
fmt.SetHashAlgorithm("SHA1");
var sig2 = fmt.CreateSignature(hash);
//輸出2
Console.WriteLine(BitConverter.ToString(sig2));
//使用VerifyHash
//輸出3
Console.WriteLine(rsa.VerifyHash(hash, oid.FriendlyName, sig1));
//使用AsymmetricSignatureDeformatter(RSAPKCS1SignatureDeformatter).VerifySignature
var defmt = new RSAPKCS1SignatureDeformatter();
defmt.SetKey(rsa);
defmt.SetHashAlgorithm("SHA1");
//輸出4
Console.WriteLine(defmt.VerifySignature(hash, sig2));
}
輸出:
31-18-4E-93-DF-1D-FF-EC-76-19-AE-68-01-67-36-E5-29-A3-6C-1F-A5-EA-9A-C5-BC-B5-2F
-AF-60-71-16-61-71-5F-60-65-8A-17-C9-D3-A2-CE-EB-A3-FE-58-0F-45-98-07-62-71-18-A
7-AA-8C-3A-EF-B6-B7-D1-D7-5C-EC-2F-A7-C7-5F-61-EC-66-14-9C-05-5C-C9-01-88-28-35-
95-02-BA-DD-96-B6-F3-B5-5B-D4-FD-54-1F-53-64-F7-77-5A-AE-5D-87-64-24-18-43-6E-AD
-9A-EB-35-69-53-67-D8-4F-D5-44-98-89-C4-9B-6F-3F-16-08-65-00-84
31-18-4E-93-DF-1D-FF-EC-76-19-AE-68-01-67-36-E5-29-A3-6C-1F-A5-EA-9A-C5-BC-B5-2F
-AF-60-71-16-61-71-5F-60-65-8A-17-C9-D3-A2-CE-EB-A3-FE-58-0F-45-98-07-62-71-18-A
7-AA-8C-3A-EF-B6-B7-D1-D7-5C-EC-2F-A7-C7-5F-61-EC-66-14-9C-05-5C-C9-01-88-28-35-
95-02-BA-DD-96-B6-F3-B5-5B-D4-FD-54-1F-53-64-F7-77-5A-AE-5D-87-64-24-18-43-6E-AD
-9A-EB-35-69-53-67-D8-4F-D5-44-98-89-C4-9B-6F-3F-16-08-65-00-84
True
True
結果正確!