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

简介: 原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法[源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 作者:webabcd介绍重新想象 Windows 8 Store Apps ...
原文: 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法

[源码下载]


重新想象 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
[源码下载]

目录
相关文章
|
2月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
124 0
|
3月前
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
7月前
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
414 2
使用SM4算法加密LUKS格式磁盘
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
592 1
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点展示了如何使用 Kotlin 实现 AES-256 的加密和解密,提供了详细的代码示例。
287 2
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
915 1
|
28天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
29天前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
30天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真
本程序基于Matlab 2024b实现,结合粒子群优化(PSO)与XGBoost算法,用于时间序列预测。通过PSO优化XGBoost超参数,提升预测精度。程序包含完整注释与操作视频,运行后生成预测效果图及性能评估指标RMSE。
|
28天前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
115 3

热门文章

最新文章