说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES、AES等。在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不完全是托管代码,而又类似于COM的形式公开,这对于低端设备来说,性能可以提升,当然了,对于高端设备来说无所谓。

在WP的RT应用中,涉及到加/解密的API都在以下几个命名空间里,大家要用的就在里面找,也不是所有类都会用得上,加密一般就用两大类:需要恢复内容时选用双向加密,如DES、AES等算法;如果不需要还原被加密的内容,就用大家严重熟悉的MD5等哈希算法。比如密码

1、Windows.Security.Cryptography

2、Windows.Security.Cryptography.Core

3、Windows.Security.Cryptography.DataProtection

其中,DataProtection下所用的是系统实现的算法来加密和解密数据,比较方便,但不方便传输,比较适合在本机使用,不适宜加密和解密通过网络传输的加密数据,通用性不那么强。

今天先给大家简单介绍一下双向加密,我这个人性格比较坏,不喜欢一个类一个类地去介绍,然后列个表格说这个类有哪些属性,方法之类的写作方式。我比较BS那些老是抄MSDN的人。因此,不要指望我会机械式地给你讲解,老周不喜欢这样,老周向来对实例讲述情有独衷。

不过呢,一些必要的口水还是要的,不管你使用哪种算法来加密和解密数据,都要用到CryptographicEngine类,这个类人品值很高,是静态的,加密解密时直接调用它的方法即可,不用new它的实例。加密时调用Encrypt方法,解密时调用Decrypt方法。

双向加密通常要准备两个东西,一个是密钥Key,一个是初始向量iv,iv不是必须的,但key是不可少的。加密时用的key和iv,而在解密时也要用与加密时相同的key和iv才能解密。这个相信不用我废话了,这是小学一年级的常识。

接下来说说步骤:

第一步,通过SymmetricKeyAlgorithmProvider的静态方法OpenAlgorithm()得到一个SymmetricKeyAlgorithmProvider实例,方法参数是要使用的加/解密算法的名字,这个字符串不用我们去猜怎么写,直接通过SymmetricAlgorithmNames的静态属性就能返回算法的相应名字。

  SymmetricKeyAlgorithmProvider syprd = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.DesCbc);

第二步,创建key,其实key是一组字节,我这个例子是以DES算法为例,key是64位,即8个字节,这些字节怎么生成,大家自己发挥个人想象力吧,为了简单,我直接用12345678来充当这8个字节。

        // 表示Key的字节数组
byte[] keyBtArray = { , , , , , , , };
// 表示初始向量(iv)的字节数组
byte[] ivBtArray = { , , , , , , , };
// 表示加/解密的密钥的对象
CryptographicKey myKey = null;

产生key的方法是调用刚才创建的SymmetricKeyAlgorithmProvider实例的CreateSymmetricKey方法。这里我先给大家说明一个情况。由于RT API里面在处理字节缓冲区时常用到IBuffer,实现接口类型为Buffer类。故.net的API中为byte[]定义了一个扩展方法,通过AsBuffer方法可以产生Buffer对象。

            IBuffer keybuffer = keyBtArray.AsBuffer();
myKey = syprd.CreateSymmetricKey(keybuffer);

第三步,加密。加密很简单,直接调用CryptographicEngine.Encrypt方法就可以了,返回的是加密后的数据。

            // 进行加密
this.cryptBuffer = CryptographicEngine.Encrypt(myKey, txtBuffer, ivBtArray.AsBuffer());

第四步,解密。解密也是简单地调用。

            // 解密
IBuffer decryptBuffer = CryptographicEngine.Decrypt(myKey, this.cryptBuffer, ivBtArray.AsBuffer());

本例子是让用户在TextBox中输入文本,先将文本加密,然后再解密,并显示解密后的文本。

    <StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="22"/>
</Style>
</StackPanel.Resources>
<TextBlock Text="请输入待加密内容:"/>
<TextBox Name="txtInput"/>
<Button Margin="0,25,0,0" Content="加密" Click="OnEncryptClick"/>
<Button Click="OnDecryptoClick">解密</Button>
<TextBlock Margin="0,25,0,0" Text="解密后:"/>
<TextBlock Name="tbDecrypto" FontSize="28" Foreground="SkyBlue"/>
</StackPanel>
        private async void OnEncryptClick(object sender, RoutedEventArgs e)
{
// 将输入的文本转换为字节缓冲区
IBuffer txtBuffer = CryptographicBuffer.ConvertStringToBinary(txtInput.Text, BinaryStringEncoding.Utf8);
Button b = sender as Button;
b.IsEnabled = false;
// 进行加密
this.cryptBuffer = CryptographicEngine.Encrypt(myKey, txtBuffer, ivBtArray.AsBuffer());
Windows.UI.Popups.MessageDialog msgdlg = new Windows.UI.Popups.MessageDialog("加密完成。");
await msgdlg.ShowAsync();
b.IsEnabled = true;
} private async void OnDecryptoClick(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.IsEnabled = false;
// 解密
IBuffer decryptBuffer = CryptographicEngine.Decrypt(myKey, this.cryptBuffer, ivBtArray.AsBuffer());
tbDecrypto.Text = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, decryptBuffer);
Windows.UI.Popups.MessageDialog msgbox = new Windows.UI.Popups.MessageDialog("解密完成。");
await msgbox.ShowAsync();
b.IsEnabled = true;
}

要将文本转换为Buffer,可以用CryptographicBuffer.ConvertStringToBinary方法;反过来可以用CryptographicBuffer.ConvertBinaryToString,编码方式一般用utf-8,这样通用性好。

似乎一切就绪,但动行后,在加密时会发生异常,提示输入的缓冲区无效。这个错误很多人都遇到,我看到在MSDN社区上有不少朋友提问,其他社区上也有,不管用的DES还是AES算法。为什么加密时会出错呢?

那是因为加密处理的字节块没有对齐导致的。可以用以下代码来获得某种加密算法的块大小。

System.Diagnostics.Debug.WriteLine("块大小:" + syprd.BlockLength);

就是SymmetricKeyAlgorithmProvider实例的BlockLength属性,DES算法输出以下结果:

8就是8个字节,如果要加密的数据的字节总数不是8的倍数的话就会出错,如果被加密的数据大小为16字节,可以被8整除,不会出错,如果是23,不能被8整除,就会发生异常。

好,找到原因了,解决起来就有针对性了,一种方法是你自己动手,想办法把被加密的数据的长度弄成8的倍数。比如23字节,你就想办法加一个字节,让它变成24个字节。

其实嘛,有一种方法更简单,就是让算法自己去填充,方法是在new出SymmetricKeyAlgorithmProvider实例,我们原来用的是SymmetricAlgorithmNames.DesCbc,把它改为SymmetricAlgorithmNames.DesCbcPkcs7就行了。因为Pkcs7模式会自动填充字节块。

     SymmetricKeyAlgorithmProvider syprd = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.DesCbcPkcs7);

这样一改,加密时就不会出错,因为字节块被自动填充。

看看运行结果:

AES的加密解密也与DES类似。

看看时间,差不多开饭了,先说到这里吧,下一篇咱们聊聊单向加密吧。

源码下载:http://files.cnblogs.com/files/tcjiaan/CryptoApp.zip

【WP开发】加密篇:双向加密的更多相关文章

  1. 【WP开发】加密篇:单向加密

    单向加密,简单地说就是对数据进行哈希处理,平时我们见得较多的有MD5.SHA1等,都属于单向加密.上一篇文章中,老周跟大家扯了有关双向加密的事,本文咱们就扯一下单向加密吧. 要对数据进行哈希处理也不是 ...

  2. WP开发笔记——字符串 转 MD5 加密

    将字符串进行MD5加密,返回加密后的字符串. 从这里下载Md5.cs文件:http://pan.baidu.com/s/1hq3gpnu. 添加到Windows Phone 7项目中,在代码里面这样调 ...

  3. 简单讲解iOS应用开发中的MD5加密的相关使用<转>

    这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用,示例代码基于传统的Objective-C,需要的朋友可以参考下 一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POS ...

  4. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

  5. MySQL数据库的双向加密方式

    如果你正在运行使用MySQL的Web应用程序,那么你把密码或者其他敏感信息保存在应用程序里的机会就很大.保护这些数据免受或者窥探者的获取 是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者 ...

  6. PHP 服务端 和 APP 客户端 实现 RSA+AES 双向加密解密

    目的:服务端和移动端双向加密解密 共有七个文件 其中包括三个类文件 lib_aes.php aes对称加密解密类 server_rsa_crypt.php 服务端RSA公钥私钥非对称加密解密类 cli ...

  7. 麦子学院python开发全套完整无加密课程

    点击了解更多Python课程>>> 麦子学院python开发全套完整无加密课程 第一阶段:Python基础准备 1.Web前端开发之HTML+CSS基础入门 2.Javascript ...

  8. linux初学者-磁盘加密篇

    linux初学者-磁盘加密篇 因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全.所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏, ...

  9. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

随机推荐

  1. 实验二 c语言文法

    <程序>-><声明>|<程序><函数> <函数>-><修饰符><标识符><形式参数>< ...

  2. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

  3. Shader实例:NGUI图集中的UISprite正确使用Shader的方法

    效果: 变灰,过滤,流光 都是UI上常用效果. 比如: 1.按钮禁用时,变灰. 2.一张Icon要应付圆形背景框,又要应付矩形背景框.就要使用过滤的方式来裁剪. 避免了美术提供两张icon的麻烦,又节 ...

  4. 1. Activiti 运行时表信息总结

    Activiti的后台是有数据库的支持,所有的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. ACT_RE_*: 'RE'表示repository. 这个前缀 ...

  5. CentOS安装配置redis

    安装前准备,安装gcc 先用 gcc -v命令检测本机是否安装gcc,如果没有则用下面命令安装: yum install cpp yum install binutils yum install gl ...

  6. 喜马拉雅FM抓包之旅

    一.概述 最近学院组织安排大面积实习工作,今天刚刚发布了喜马拉雅FM实习生招聘的面试通知.通知要求:公司采用开放式题目的方式进行筛选,申请的同学须完成如下题目 写程序输出喜马拉雅FM上与"卓 ...

  7. Smart3D系列教程4之 《案例实战演练1——小物件的照片三维重建》

    一.前言 Wish3D出品的Smart3D系列教程已经推出3讲了,分别是关于倾斜摄影三维建模原理应用.照片采集技巧.Smart3D各个功能模块的作用,它们都是围绕Smart3D建模软件进行的讲解.那么 ...

  8. mysql自动加入添加时间列

    `addtime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  9. 【TJOI&HEOI2016】【Bzoj4551】树

    这道题是可以用树链剖分来做的,但其实有比它更加简单的做法--并查集. 可以想到,这类题的一种常见做法是离线处理,先全部读入,再从后往前处理,每次遇到标记操作,就把这个点的标记次数减一,到零以后就把这个 ...

  10. springmvc入门的第一个小例子

    今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...