最近一个项目中需要运用到加密,由于当初这个项目是采用Java开发的,项目中就是采用的TripleDES加密算法,现在我想改为Windows版本(C#版本);C#语言倒是有TripleDES算法的实现,Sliverlight (.NET 4)中却不直接支持了,所以问题就来了。
本来我打算直接Copy C#中相关支持的dll文件或者源代码用的,但是太多了,我这人比较懒,就想找个可以不那么麻烦的方式。
在Silverlight和Windows Phone 在CodePlex值得推荐开源第三方库是SSH.NET Library
SSH.NET Library:
SSH.NET Library库移植灵感是来源于Java版本.不过SSH。NET是完全基于.NET 没有采用任何第三方组件和引用. 其中实现也包含同步和异步的封装. Socket通信库. HTTP代等.其中最为重要的是基于.NET 实现DES和TripleDES[3DES] 两种核心算法. 并且支持.NET 3.5 、Silverlight、Windows Phone.
当然除了Codeplex上这个比较成熟SSH.NET Library开源组件外.关于DES和TripleDES[3DES] 还可以找到其他类似可选的开源组件.针对Windows Phone 缺乏3DES支持.国外一个WP 开发者Nicolas Humann[Link in] 基于broccoliproducts 的DES, TripleDES and BlowFish in Silverlight 版本库做了进一步的集成和封装. 并成功移植DES和TripleDES[3DES]Windows phone版本:
Nicolas Humann[Link in] DES And TripleDES[3DES] Component:
TripleDES Cryptography On Silverlight And Windows Phone
针对Nicolas Humann[Link in] 这个3DES版本移植ku.在其基础做了进一步的封装.为了是实现对TripleDESCryptoServiceProvider 类[3DES核心实现类]对数据加密和解密的操作. 大概分为两种情况.一种是需要IV密钥Key 另外一种不需要密钥Key 数据基于3DES和DES 加密和解密的封装. 代码你们就自己去下面这个网站上看吧:点击打开链接
当然其中涉及到一个第三方包: Phone7.Fx.Preview.zip (17,05 kb)有了该包,怎么实现就是小问题了,下面是我的实现方式:
class TripleDESCryptoService
{
// 密钥
private static readonly string SecretKey = "liuyunqiang@lx100$#365#$";
// 向量
private static readonly string IV = "01234567";
/// <summary>
/// TripleDes 加密
/// </summary>
/// <param name="sourceContent">Source Content</param>
/// <param name="encryptKey">Encrypt Key</param>
/// <returns>Encrypt Bytes Array</returns>
public static string Encrypt(string sourceContent)
{
if (string.IsNullOrEmpty(sourceContent))
return string.Empty;
var toEncryptSourceStr = Encoding.UTF8.GetBytes(sourceContent);
var EncryptBytes = RunTripleDes(toEncryptSourceStr, true);
var encryptFormatStr = Convert.ToBase64String(EncryptBytes, 0, EncryptBytes.Length);
return encryptFormatStr;
}
/// <summary>
/// TripleDes 解密
/// </summary>
/// <param name="encryptKey">Encrypt key can be null</param>
/// <param name="ivKey">Iv</param>
/// <param name="encryptBytes">EncryptBytes</param>
/// <returns>Return String </returns>
public static string DeEncrypt(string encryptContent)
{
if (string.IsNullOrEmpty(encryptContent))
return string.Empty;
byte[] encryptBytes = Convert.FromBase64String(encryptContent);
var DecryptBytes = RunTripleDes(encryptBytes, false);
string unDecryptFomatStr = Encoding.UTF8.GetString(DecryptBytes, 0, DecryptBytes.Length);
return unDecryptFomatStr;
}
/// <summary>
/// 设置加密引擎,并输出加/解密二进制结果
/// </summary>
/// <param name="input"></param>
/// <param name="encrypt"></param>
/// <returns></returns>
private static byte[] RunTripleDes(byte[] input, bool encrypt)
{
var rgbKey = Encoding.UTF8.GetBytes(SecretKey);
var rgbIV = Encoding.UTF8.GetBytes(IV);
var keyParam = new DesEdeParameters(rgbKey);
var ivParam = new ParametersWithIV(keyParam, rgbIV);
var engine = CipherUtilities.GetCipher("DESede/CBC/PKCS7PADDING");
engine.Init(encrypt, ivParam);
var output = engine.DoFinal(input);
return output;
}
}