现在的位置: 首页 > 综合 > 正文

.NET(C#):使用AsymmetricSignatureFormatter类和AsymmetricSignatureDeformatter类

2012年05月29日 ⁄ 综合 ⁄ 共 2561字 ⁄ 字号 评论关闭

在前一篇文章:.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

结果正确!

抱歉!评论已关闭.