设为首页 收藏本站
查看: 1311|回复: 0

重新想象 Windows 8 Store Apps (31)

[复制链接]

尚未签到

发表于 2015-5-22 08:24:35 | 显示全部楼层 |阅读模式
  [源码下载]




重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法  
作者:webabcd

介绍
重新想象 Windows 8 Store Apps 之 加密解密


  • hash 算法(MD5, SHA1, SHA256, SHA384, SHA512)
  • hmac 算法(MD5, SHA1, SHA256, SHA384, SHA512)
  • 本地数据的加密解密
  • 对称算法(AES, DES, 3DES, RC2, RC4)
  
示例
1、演示如何使用 hash 算法(MD5, SHA1, SHA256, SHA384, SHA512)
Crypto/Hash.xaml.cs



/*
* 演示如何使用 hash 算法(MD5, SHA1, SHA256, SHA384, SHA512)
*/
using System;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Crypto
{
public sealed partial class Hash : Page
{
public Hash()
{
this.InitializeComponent();
}
private void btnDemo_Click(object sender, RoutedEventArgs e)
{
string plainText = "i am webabcd";
lblMsg.Text = "原文: " + plainText;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
string[] algorithmNames = { "MD5", "SHA1", "SHA256", "SHA384", "SHA512" };
foreach (var algorithmName in algorithmNames)
{
// 根据算法名称实例化一个哈希算法提供程序
HashAlgorithmProvider hashAlgorithm = HashAlgorithmProvider.OpenAlgorithm(algorithmName);
// hashAlgorithm.HashLength - 哈希后的值的长度,单位:字节
// 原文的二进制数据
IBuffer vector = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8);
// 哈希二进制数据
IBuffer digest = hashAlgorithm.HashData(vector);
lblMsg.Text += algorithmName + ": " + CryptographicBuffer.EncodeToHexString(digest);
lblMsg.Text += Environment.NewLine;

// 创建一个可重用的 CryptographicHash 对象
CryptographicHash reusableHash = hashAlgorithm.CreateHash();
reusableHash.Append(CryptographicBuffer.ConvertStringToBinary("i ", BinaryStringEncoding.Utf8)); // 向 CryptographicHash 中追加需要哈希的二进制数据
reusableHash.Append(CryptographicBuffer.ConvertStringToBinary("am ", BinaryStringEncoding.Utf8)); // 向 CryptographicHash 中追加需要哈希的二进制数据
reusableHash.Append(CryptographicBuffer.ConvertStringToBinary("webabcd", BinaryStringEncoding.Utf8)); // 向 CryptographicHash 中追加需要哈希的二进制数据
// 获取哈希后的数据,然后清空 CryptographicHash 中的数据
digest = reusableHash.GetValueAndReset();
lblMsg.Text += algorithmName + ": " + CryptographicBuffer.EncodeToHexString(digest);
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
}
}
}
}
  
2、演示如何使用 hmac 算法(HMAC_MD5, HMAC_SHA1, HMAC_SHA256, HMAC_SHA384, HMAC_SHA512)
Crypto/Hmac.xaml.cs



/*
* 演示如何使用 hmac 算法(HMAC_MD5, HMAC_SHA1, HMAC_SHA256, HMAC_SHA384, HMAC_SHA512)
*
* 注:hmac 相当于带密钥的 hash,可以理解为将信息用密钥加密后再哈希
*/
using System;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Crypto
{
public sealed partial class Hmac : Page
{
public Hmac()
{
this.InitializeComponent();
}
private void btnDemo_Click(object sender, RoutedEventArgs e)
{
string plainText = "i am webabcd";
lblMsg.Text = "原文: " + plainText;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
string[] algorithmNames = { "HMAC_MD5", "HMAC_SHA1", "HMAC_SHA256", "HMAC_SHA384", "HMAC_SHA512" };
foreach (var algorithmName in algorithmNames)
{
// 根据算法名称实例化一个 hmac 算法提供程序
MacAlgorithmProvider hmacAlgorithm = MacAlgorithmProvider.OpenAlgorithm(algorithmName);
// hmacAlgorithm.MacLength - hmac 后的值的长度,单位:字节
// 创建一个用于 hmac 算法的随机的 key
IBuffer key = CryptographicBuffer.GenerateRandom(hmacAlgorithm.MacLength);
// 根据 key 生成 CryptographicKey 对象
CryptographicKey hmacKey = hmacAlgorithm.CreateKey(key);
// 根据 hmacKey 签名指定的内容
IBuffer signature = CryptographicEngine.Sign(
hmacKey, // 签名时所用的 key
CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8) // 需要签名的内容
                );
lblMsg.Text += algorithmName + ": " + CryptographicBuffer.EncodeToHexString(signature) + " (key: " + CryptographicBuffer.EncodeToHexString(key) + ")";
lblMsg.Text += Environment.NewLine;

// 验证签名
bool isAuthenticated = CryptographicEngine.VerifySignature(
hmacKey, // 签名时所用的 key
CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8), // 需要签名的内容
signature // 签名后的值
                );
lblMsg.Text += "isAuthenticated: " + isAuthenticated;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
}
}
}
}
  
3、演示如何对本地数据进行加密和解密
Crypto/LocalCrypto.xaml.cs



/*
* 演示如何对本地数据进行加密和解密
*/
using System;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.DataProtection;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Crypto
{
public sealed partial class LocalCryptoString : Page
{
public LocalCryptoString()
{
this.InitializeComponent();
}
private async void btnDemo_Click(object sender, RoutedEventArgs e)
{
string plainText = "i am webabcd";
lblMsg.Text = "原文: " + plainText;
lblMsg.Text += Environment.NewLine;
// 实例化用于加密的 DataProtectionProvider - Local=user 用户级别的本地加解密;LOCAL=machine - 机器级别的本地加解密
DataProtectionProvider provider = new DataProtectionProvider("Local=user"); // "LOCAL=machine"
// 原文的二进制数据
IBuffer buffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8);
// 加密数据
IBuffer encrypted = await provider.ProtectAsync(buffer);
// provider.ProtectStreamAsync(); 加密 stream 类型的数据
// 加密后的结果
lblMsg.Text += "encrypted: " + CryptographicBuffer.EncodeToHexString(encrypted);
lblMsg.Text += Environment.NewLine;

// 实例化用于解密的 DataProtectionProvider
DataProtectionProvider provider2 = new DataProtectionProvider();
// 解密数据
IBuffer decrypted = await provider2.UnprotectAsync(encrypted);
// provider2.UnprotectStreamAsync(); // 解密 stream 类型的数据
// 解密后的结果
lblMsg.Text += "decrypted: " + CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decrypted);
lblMsg.Text += Environment.NewLine;
}
}
}
  
4、演示如何使用对称算法(AES, DES, 3DES, RC2, RC4)
Crypto/Symmetric.xaml.cs



/*
* 演示如何使用对称算法(AES, DES, 3DES, RC2, RC4)
*/
using System;
using Windows.Security.Cryptography;
using Windows.Security.Cryptography.Core;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Crypto
{
public sealed partial class Symmetric : Page
{
public Symmetric()
{
this.InitializeComponent();
}
private void btnDemo_Click(object sender, RoutedEventArgs e)
{
// 本示例的原文为 16 个字节,是为了正常演示无填充时的加密
// 什么是填充:比如 aes 要求数据长度必须是 16 的倍数,如果不是则需要通过指定的填充模式来补全数据
string plainText = "1234567812345678";
lblMsg.Text = "原文: " + plainText;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
string[] algorithmNames = { "AES_CBC", "AES_ECB", "AES_CBC_PKCS7", "AES_ECB_PKCS7", "DES_CBC", "DES_ECB", "3DES_CBC", "3DES_ECB", "3DES_CBC_PKCS7", "3DES_ECB_PKCS7", "RC2_CBC", "RC2_ECB", "RC4" };
foreach (var algorithmName in algorithmNames)
{
uint keySize = 128;
if (algorithmName.StartsWith("AES")) // AES 算法密钥长度 128 位
keySize = 128;
else if (algorithmName.StartsWith("DES")) // DES 算法密钥长度 64 位(56 位的密钥加上 8 位奇偶校验位)
keySize = 64;
else if (algorithmName.StartsWith("3DES")) // 3DES 算法密钥长度 192 位(3 重 DES)
keySize = 192;
else if (algorithmName.StartsWith("RC2")) // RC2 算法密钥长度可变
keySize = 128;
else if (algorithmName.StartsWith("RC4")) // RC4 算法密钥长度可变
keySize = 128;
IBuffer buffer; // 原文
IBuffer encrypted; // 加密后
IBuffer decrypted; // 解密后
IBuffer iv = null; // 向量(CBC 模式)
// 根据算法名称实例化一个对称算法提供程序
SymmetricKeyAlgorithmProvider symmetricAlgorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(algorithmName);
// 创建一个随机密钥 key
IBuffer key = CryptographicBuffer.GenerateRandom(keySize / 8);
// 根据 key 生成 CryptographicKey 对象
CryptographicKey cryptoKey = symmetricAlgorithm.CreateSymmetricKey(key);
// 如果是 CBC 模式则随机生成一个向量
if (algorithmName.Contains("CBC"))
iv = CryptographicBuffer.GenerateRandom(symmetricAlgorithm.BlockLength);
// 将需要加密的数据转换为 IBuffer 类型
buffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8);
try
{
// 加密数据
encrypted = CryptographicEngine.Encrypt(cryptoKey, buffer, iv);
}
catch (Exception ex)
{
lblMsg.Text += ex.ToString();
lblMsg.Text += Environment.NewLine;
return;
}
// 加密后的结果
lblMsg.Text += algorithmName + " encrypted: " + CryptographicBuffer.EncodeToHexString(encrypted);
lblMsg.Text += Environment.NewLine;

CryptographicKey cryptoKey2 = symmetricAlgorithm.CreateSymmetricKey(key);
try
{
// 解密数据
decrypted = Windows.Security.Cryptography.Core.CryptographicEngine.Decrypt(cryptoKey2, encrypted, iv);
}
catch (Exception ex)
{
lblMsg.Text += ex.ToString();
lblMsg.Text += Environment.NewLine;
return;
}
// 解密后的结果
lblMsg.Text += algorithmName + " decrypted: " + CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decrypted);
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
}
}
}
}
  
OK
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69349-1-1.html 上篇帖子: 零基础在线制作Windows Phone 8 应用 下篇帖子: Windows Phone 8使用初体验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表