【安全篇】.NET,Android,iOS 双向互通DES+

2016-11-25  本文已影响0人  methodname

因为项目的需求,最近几天一直在看关于加密的问题,将项目中使用到的DES加密整理一下,它可以使用适用于NET,Android,iOS三个平台.

DES加密,DES有两种,一种是DES,对每组分组进行一次加密,另一种是DES的升级版3DES,就是对每组分组进行3此加密,前者最大可使用8位的密匙,后者最大可使用24为密匙。

看代码:

.NET

<pre>
<code class = 'cs hljs'>
//////
/// 密匙
//////
public static string sKey = "12345678";

///
/// 解密
///
/// 要解密的以Base64
/// 密钥,且必须为8位
/// 已解密的字符串
public static string DesDecrypt(string pToDecrypt)
{
//转义特殊字符
pToDecrypt = pToDecrypt.Replace("-", "+");
pToDecrypt = pToDecrypt.Replace("_", "/");
pToDecrypt = pToDecrypt.Replace("~", "=");
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Encoding.UTF8.GetString(ms.ToArray());
ms.Close();
return str;
}
}

/// 对字符串进行DES加密
///
/// 待加密的字符串
/// 加密后的BASE64编码的字符串
public string Encrypt(string sourceString)
{
byte[] btKey = Encoding.UTF8.GetBytes(sKey);
byte[] btIV = Encoding.UTF8.GetBytes(sKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
using (MemoryStream ms = new MemoryStream())
{
byte[] inData = Encoding.UTF8.GetBytes(sourceString);
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write))
{
cs.Write(inData, 0, inData.Length);
cs.FlushFinalBlock();
}
return Convert.ToBase64String(ms.ToArray());
}
catch
{
throw;
}
}
}

</code></pre>

Android

<pre><code class= 'hljs'>
// 加密
public static String DecryptDoNet(String message, String key)

   throws Exception {

byte[] bytesrc = Base64.decode(message.getBytes(), Base64.DEFAULT);

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

byte[] retByte = cipher.doFinal(bytesrc);

return new String(retByte);

}

// 解密
public static String EncryptAsDoNet(String message, String key) throws Exception {

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));

cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

byte[] encryptbyte = cipher.doFinal(message.getBytes());

return new String(Base64.encode(encryptbyte, Base64.DEFAULT));

}
</code></pre>

iOS

<pre>
<code class='Xcode'>

/**

/**

</code></pre>

iOS中需要用到的GTMBase64库

如果只需要DES加密的话,将Base64去掉即可

END

上一篇 下一篇

猜你喜欢

热点阅读