在前一篇文章:.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
结果正确!