重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类

简介: 原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类[源码下载] 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 作者:webabcd介绍重新想象 Windows 8 S...
原文: 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类

[源码下载]


重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类



作者:webabcd


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

  • 非对称算法(RSA)
  • 签名和验证签名(RSA)
  • 通过 CryptographicBuffer 来实现 string hex base64 binary 间的相互转换



示例
1、演示如何使用非对称算法(RSA)
Crypto/Asymmetric.xaml.cs

/*
 * 演示如何使用非对称算法(RSA)
 */

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 Asymmetric : Page
    {
        public Asymmetric()
        {
            this.InitializeComponent();
        }

        private void btnDemo_Click(object sender, RoutedEventArgs e)
        {
            string plainText = "i am webabcd";
            uint keySize = 2048;

            lblMsg.Text = "原文: " + plainText;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "keySize: " + keySize / 8;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += Environment.NewLine;

            string[] algorithmNames = { "RSA_PKCS1", "RSA_OAEP_SHA1", "RSA_OAEP_SHA256", "RSA_OAEP_SHA384", "RSA_OAEP_SHA512" };

            foreach (var algorithmName in algorithmNames)
            {
                /*
                 * 对于 RSA 非对称加密来说,其对原文的长度是有限制的,所以一般用 RSA 来加密对称算法的密钥
                 * 
                 * RSA_PKCS1 要求原文长度 <= 密钥长度 - 3,单位:字节
                 * OAEP 要求原文长度 <= 密钥长度 - 2 * HashBlock - 2,单位:字节
                 *     RSA_OAEP_SHA1 - 密钥长度为 1024 时,最大原文长度 1024 / 8 - 2 * 20 - 2 = 90
                 *     RSA_OAEP_SHA256 - 密钥长度为 1024 时,最大原文长度 1024 / 8 - 2 * (256 / 8) - 2 = 66
                 *     RSA_OAEP_SHA384 - 密钥长度为 2048 时,最大原文长度 2048 / 8 - 2 * (384 / 8) - 2 = 162
                 *     RSA_OAEP_SHA512 - 密钥长度为 2048 时,最大原文长度 2048 / 8 - 2 * (512 / 8) - 2 = 130
                 */

                IBuffer buffer; // 原文
                IBuffer encrypted; // 加密后
                IBuffer decrypted; // 解密后
                IBuffer blobPublicKey; // 公钥
                IBuffer blobKeyPair; // 公钥私钥对

                CryptographicKey keyPair; // 公钥私钥对

                // 原文的二进制数据
                buffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8);

                // 根据算法名称实例化一个非对称算法提供程序
                AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(algorithmName);

                try
                {
                    // 根据密钥长度随机创建一个公钥私钥对
                    keyPair = asymmetricAlgorithm.CreateKeyPair(keySize);
                }
                catch (Exception ex)
                {
                    lblMsg.Text += ex.ToString();
                    lblMsg.Text += Environment.NewLine;
                    return;
                }

                // 加密数据(通过公钥)
                encrypted = CryptographicEngine.Encrypt(keyPair, buffer, null);

                // 加密后的结果
                lblMsg.Text += algorithmName + " encrypted: " + CryptographicBuffer.EncodeToHexString(encrypted) + " (" + encrypted.Length + ")";
                lblMsg.Text += Environment.NewLine;

                // 导出公钥
                blobPublicKey = keyPair.ExportPublicKey();
                // 导出公钥私钥对
                blobKeyPair = keyPair.Export();



                // 导入公钥
                CryptographicKey publicKey = asymmetricAlgorithm.ImportPublicKey(blobPublicKey);
                // 导入公钥私钥对
                CryptographicKey keyPair2 = asymmetricAlgorithm.ImportKeyPair(blobKeyPair);

                // 解密数据(通过私钥)
                decrypted = CryptographicEngine.Decrypt(keyPair2, encrypted, null);

                // 解密后的结果
                lblMsg.Text += algorithmName + " decrypted: " + CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decrypted);
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += Environment.NewLine;
            }
        }
    }
}


2、演示如何通过非对称算法(RSA)来签名和验证签名
Crypto/Sign.xaml.cs

/*
 * 演示如何通过非对称算法(RSA)来签名和验证签名
 */

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 Sign : Page
    {
        public Sign()
        {
            this.InitializeComponent();
        }

        private void btnDemo_Click(object sender, RoutedEventArgs e)
        {
            string plainText = "i am webabcd";
            uint keySize = 2048;

            lblMsg.Text = "原文: " + plainText;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "keySize: " + keySize / 8;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += Environment.NewLine;

            string[] algorithmNames = { "RSASIGN_PKCS1_SHA1", "RSASIGN_PKCS1_SHA256", "RSASIGN_PKCS1_SHA384", "RSASIGN_PKCS1_SHA512", "RSASIGN_PSS_SHA1", "RSASIGN_PSS_SHA256", "RSASIGN_PSS_SHA384", "RSASIGN_PSS_SHA512" };

            foreach (var algorithmName in algorithmNames)
            {
                IBuffer buffer; // 原文
                IBuffer blobPublicKey; // 公钥
                IBuffer blobKeyPair; // 公钥私钥对

                CryptographicKey keyPair; // 公钥私钥对

                // 原文的二进制数据
                buffer = CryptographicBuffer.ConvertStringToBinary(plainText, BinaryStringEncoding.Utf8);

                // 根据算法名称实例化一个非对称算法提供程序
                AsymmetricKeyAlgorithmProvider asymmetricAlgorithm = AsymmetricKeyAlgorithmProvider.OpenAlgorithm(algorithmName);

                try
                {
                    // 根据密钥长度随机创建一个公钥私钥对
                    keyPair = asymmetricAlgorithm.CreateKeyPair(keySize);
                }
                catch (Exception ex)
                {
                    lblMsg.Text += ex.ToString();
                    lblMsg.Text += Environment.NewLine;
                    return;
                }

                // 对原文进行签名(通过私钥)
                IBuffer signature = CryptographicEngine.Sign(keyPair, buffer);
                lblMsg.Text += algorithmName + " - 原文已被签名,签名后的数据: " + CryptographicBuffer.EncodeToHexString(signature);
                lblMsg.Text += Environment.NewLine;

                // 导出公钥
                blobPublicKey = keyPair.ExportPublicKey();
                // 导出公钥私钥对
                blobKeyPair = keyPair.Export();



                // 导入公钥
                CryptographicKey publicKey = asymmetricAlgorithm.ImportPublicKey(blobPublicKey);

                // 验证签名(通过公钥)
                bool isAuthenticated = CryptographicEngine.VerifySignature(publicKey, buffer, signature);
                lblMsg.Text += "签名验证的结果: " + isAuthenticated;
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += Environment.NewLine;
            }
        }
    }
}


3、通过 CryptographicBuffer 来实现 string hex base64 binary 间的相互转换
Crypto/CryptographicBufferDemo.xaml.cs

/*
 * 通过 CryptographicBuffer 来实现 string hex base64 binary 间的相互转换
 * 
 * 注:CryptographicBuffer 相当于加解密过程中的一个辅助类
 */

using Windows.Security.Cryptography;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace XamlDemo.Crypto
{
    public sealed partial class CryptographicBufferDemo : Page
    {
        public CryptographicBufferDemo()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 将 IBuffer 对象转换为 string
            // string CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding encoding, IBuffer buffer);

            // 将 string 转换为 IBuffer 对象
            // IBuffer CryptographicBuffer.ConvertStringToBinary(string value, BinaryStringEncoding encoding);

            // 将 IBuffer 对象中的数据写入到 byte[]
            // void CryptographicBuffer.CopyToByteArray(IBuffer buffer, out byte[] value);

            // 将 byte[] 转换为 IBuffer 对象
            // IBuffer CryptographicBuffer.CreateFromByteArray(byte[] value);

            // 将 base64 编码字符串转换为 IBuffer 对象
            // IBuffer CryptographicBuffer.DecodeFromBase64String(string value);

            // 将 十六 进制编码字符串转换为 IBuffer 对象
            // IBuffer CryptographicBuffer.DecodeFromHexString(string value);

            // 将 IBuffer 对象中的数据转换为 base64 编码字符串
            // string CryptographicBuffer.EncodeToBase64String(IBuffer buffer);

            // 将 IBuffer 对象中的数据转换为 十六 进制编码字符串
            // string CryptographicBuffer.EncodeToHexString(IBuffer buffer);

            // 生成一个 uint 类型的随机数
            // uint CryptographicBuffer.GenerateRandomNumber();

            // 根据指定长度生成一个包含随机数据的 IBuffer 对象
            // IBuffer CryptographicBuffer.GenerateRandom(uint length);

            // 比较两个 IBuffer 对象是否相等
            // bool CryptographicBuffer.Compare(IBuffer object1, IBuffer object2);
        }
    }
}



OK
[源码下载]

目录
相关文章
|
2月前
|
存储 搜索推荐 算法
加密算法、排序算法、字符串处理及搜索算法详解
本文涵盖四大类核心技术知识。加密算法部分介绍了对称加密(如 AES)、非对称加密(如 RSA)、哈希摘要(如 SHA-2)、签名算法的特点及密码存储方案(加盐、BCrypt 等)。 排序算法部分分类讲解了比较排序(冒泡、选择、插入、归并、快排、堆排序)和非比较排序(计数、桶、基数排序)的时间复杂度、适用场景及实现思路,强调混合排序的工业应用。 字符串处理部分包括字符串反转的双指针法,及项目中用正则进行表单校验、网页爬取、日志处理的实例。 搜索算法部分详解了二分查找的实现(双指针与中间索引计算)和回溯算法的概念(递归 + 剪枝),以 N 皇后问题为例说明回溯应用。内容全面覆盖算法原理与实践
118 0
|
3月前
|
算法 数据安全/隐私保护
基于混沌加密的遥感图像加密算法matlab仿真
本项目实现了一种基于混沌加密的遥感图像加密算法MATLAB仿真(测试版本:MATLAB2022A)。通过Logistic映射与Baker映射生成混沌序列,对遥感图像进行加密和解密处理。程序分析了加解密后图像的直方图、像素相关性、信息熵及解密图像质量等指标。结果显示,加密图像具有良好的随机性和安全性,能有效保护遥感图像中的敏感信息。该算法适用于军事、环境监测等领域,具备加密速度快、密钥空间大、安全性高的特点。
|
6月前
|
监控 数据可视化 数据挖掘
【开发者必看—电商篇】数据赋能电商类App转化率循序增长
通过友盟+ 数据分析工具,团队深入分析了用户行为路径、转化漏斗、停留时间及错误事件等关键数据,定位到用户体验与产品性能的问题。经过精准优化,包括简化购物流程、修复技术故障及提升稳定性,最终显著提高了用户转化率。这一案例展示了数据驱动在产品优化中的重要作用。
【开发者必看—电商篇】数据赋能电商类App转化率循序增长
|
6月前
|
监控 搜索推荐 数据挖掘
【开发者必看—阅读篇】数据赋能阅读类App精准获客
友盟+深度数据洞察技术,可以实现用户获取的高精准度与快速增长。
【开发者必看—阅读篇】数据赋能阅读类App精准获客
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
1313 1
|
7月前
|
弹性计算 算法 Linux
使用SM4算法加密LUKS格式磁盘
本文介绍了在Anolis 8操作系统使用cryptsetup对磁盘进行分区、加密和挂载的过程。采用SM4加密算法。具体步骤包括:初始化加密卷、解锁加密分区、格式化并挂载设备。最后,展示了如何取消挂载并关闭加密卷以确保数据安全。整个过程确保了磁盘数据的安全性和隐私保护。
406 2
使用SM4算法加密LUKS格式磁盘
|
10月前
|
数据库 数据安全/隐私保护 Windows
Windows远程桌面出现CredSSP加密数据修正问题解决方案
【10月更文挑战第30天】本文介绍了两种解决Windows系统凭据分配问题的方法。方案一是通过组策略编辑器(gpedit.msc)启用“加密数据库修正”并将其保护级别设为“易受攻击”。方案二是通过注册表编辑器(regedit)在指定路径下创建或修改名为“AllowEncryptionOracle”的DWORD值,并将其数值设为2。
8787 3
|
12月前
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
9月前
|
存储 缓存 安全
硬盘数据恢复:恢复硬盘数据的9个实用方法(Windows版)
无论是工作文档、家庭照片,还是其他珍贵的数字资产,数据丢失总是一件让人头疼的事情。然而,当硬盘发生问题时,不必过于慌张——只要正确应对,许多数据都可以被成功恢复。本文将从常见数据丢失原因到具体恢复方法,为您提供全面的硬盘数据恢复指导。
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
581 1

热门文章

最新文章