码迷,mamicode.com
首页 > Windows程序 > 详细

【Win10应用开发】签名与验证

时间:2015-08-25 14:08:56      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

对数据进行签名和验证,是为了防止数据被“盗版”。比较常规的做法是通过公钥进行验证。

算法上多用SAH_xxxx,就是哈希算法。由于MD5后来被发现存在“非唯一性”,你会发现现在很多一些下载的文件验证都用SHA1算法。比如我们下载一个系统.iso镜像,下载后可以核对一下哈希值,来判断文件是否完整且正确无误。

签名与验证操作并不复杂。在Windows.Security.Cryptography.Core命名空间下提供支持,像AsymmetricKeyAlgorithmProvider、MacAlgorithmProvider都可以用来生成签名的key。

 

本次我就以AsymmetricKeyAlgorithmProvider为例来演示,因为这厮可以生成公钥/私钥对,并且支持导入密钥的操作。签名后可以把key作为公钥导出,在验证时可以导入该公钥。

第一步,先得到一个AsymmetricKeyAlgorithmProvider实例,不用实例化,直接通过静态的OpenAlgorithm方法直接获得,参数是要使用的算法。

            AsymmetricKeyAlgorithmProvider asymt = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.DsaSha1);

 

第二步,调用CreateKeyPair方法生成密钥对,参数为位数,一般的值为512、1024、2048、4096,此处我用512,正常无异常。

            CryptographicKey key = asymt.CreateKeyPair(512);

另外,你还可以以公钥的形式导出,这样方便存储。

            publicKey = key.ExportPublicKey();


 

第三步,可以对数据进行签名了。

            IBuffer data = CryptographicBuffer.ConvertStringToBinary(txtInput.Text.Trim(), BinaryStringEncoding.Utf8);
            signedData = CryptographicEngine.Sign(key, data);

CryptographicEngine类公开一系列方法,用来完成加解密,要进行签名,可调用Sign方法,或者异步等待的SignAsync方法。签名之后返回签名后的数据, 以IBuffer的形式存放。

 

数据签名后可以进行验证。

第一步,同样,需要获取一个AsymmetricKeyAlgorithmProvider实例。

            AsymmetricKeyAlgorithmProvider asmt = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(AsymmetricAlgorithmNames.DsaSha1);


第二步,导入公钥。调用ImportPublicKey方法就可以导入我们刚才导出的公钥。

            CryptographicKey key = asmt.ImportPublicKey(publicKey);

导入成功后,直接可以返回一个CryptographicKey对象,下面可以直接用它来进行验证了。注意公钥必须与当初签名时导出的公钥相同,否则无法验证。

第三步,可以进行验证了。

            IBuffer data = CryptographicBuffer.ConvertStringToBinary(txtVerifyInput.Text.Trim(), BinaryStringEncoding.Utf8);
            // 注意,第三个参数是你刚才签名后得到的数据
            bool b = CryptographicEngine.VerifySignature(key, data, signedData);

VerifySignature方法用于签名验证,第一个参数是公钥,前后必须一致;第二个参数是待验证的数据;第三个参数是前面签名后得到的数据。如果验证成功,返回true;不成功返回false。

 

===================================================

看看运行结果。

技术分享

 

如果前后输入的内容相同,验证就会成功,如果前后输入的内容不同,验证就会失败。

 

示例代码下载

 

【Win10应用开发】签名与验证

标签:

原文地址:http://www.cnblogs.com/tcjiaan/p/4757086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!