WindowsPhone应用程序中加密解密数据    
在程序中加密解密是我们常要用到的功能,比如对密码,数据库连接字符串,PIN等的加密。虽然Windows Phone限制了应用程序仅能访问自己的独立存储,但是将重要数据以明文的形式存储在Isolated Storage依然是不安全的。在Windows Phone中加密解密通过Data Protection API (DPAPI)来实现。如果对加密解密有所了解的朋友会清楚,非对称的加密我们需要用到密钥对,而这往往需要我们自己生成,同时密钥本身需要存储,或者通过第三方机构颁布证书等的方式来验证信息的可靠性。而Windows Phone为我们简化了这个难题,每一个程序在第一次运行的时候就可以获得它自己的解密密钥。而我们只需要借助ProtectedData类的Protect  Unprotect方法分别实现加密和解密。对于数据类型的文件,直接可以对数据库加密,在连接字符串中使用Password参数即可。当然连接字符串本身也需要进行加密和解密,以防止密码泄露
接下来我将演示如何在Windows Phone 应用程序中运用这两个方法。本文请参考MSDN文档 http://msdn.microsoft.com/zh-cn/library/hh487164(v=VS.92).aspx



创建项目                                   

1.   创建Windows Phone 7项目EncryptionAndDecryptionWP

2.   添加TextBox控件txtData

3.   添加btnStore按钮,用于加密数据,将加密结果保存在内存中

4.   添加btnRetrieve按钮,用于解密数据,并将解密结果用弹出对话框显示。





ContentPanel部分的XAML如下:
 
<Grid x:Name="LayoutRoot" Background="Transparent">



        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,150,12,0">



            <StackPanel Orientation="Vertical">



                <TextBox x:Name="txtData" Height="80" Width="460" Foreground="{StaticResource PhoneAccentBrush}" FontSize="{StaticResource PhoneFontSizeLarge}" />



                <Button x:Name="btnStore" Content="Store" Height="71" Width="160" BorderBrush="{StaticResource PhoneAccentBrush}" Foreground="{StaticResource PhoneAccentBrush}" Click="btnStore_Click" />



                <Button x:Name="btnRetrieve" Content="Retrieve" Height="71" Width="160" BorderBrush="{StaticResource PhoneAccentBrush}" Foreground="{StaticResource PhoneAccentBrush}" Click="btnRetrieve_Click" />



            </StackPanel>



        </Grid>



    </Grid>
 
 
 

加密数据                                   



当单击btnStore后,加密txtData中的数据,并保存在变量中,代码如下:



private byte[] _encryptedBytes;







private void btnStore_Click(object sender, RoutedEventArgs e)



{



      var sourceBytes = Encoding.UTF8.GetBytes(txtData.Text.Trim());



      _encryptedBytes = ProtectedData.Protect(sourceBytes, null); 



}

 

解密数据                                      

当单击btnRetrieve后,解密数据,代码如下:

 private void btnRetrieve_Click(object sender, RoutedEventArgs e)



 {



      if (_encryptedBytes == nullreturn;



      var bytes = ProtectedData.Unprotect(_encryptedBytes, null);



      if (bytes != null) MessageBox.Show(Encoding.UTF8.GetString(bytes, 0, bytes.Length)); 



  }

 



运行结果:输入admin

 

关联文档