DES-非机密数据加密标准,可用于兼容旧系统,新系统不建议使用
3DES-DES的加强版,DES到AES之间的过渡算法
AES-高级加密标准,替代DES
RSA-非对称加密解密算法,多用于签名验证,加密解决速度慢,不建议用于大量数据的加密解密
目前跨系统间的加密数据通讯,一般是RSA与AES两种加密算法结合使用,RSA用于对AES密钥进行加密解密,AES用于对交易数据进行加密解密
算法代码:
public class EncryptHelper
{
//DES算法8位加密key,一般存在数据库或文件中
private static string defaultDesKey = "j5ca9aEn";
//DES算法8位加密向量,一般存在数据库或文件中
private static string defaultDesIv = "GTRSQ96C";
//3DES算法12位加密向量,一般存在数据库或文件中
private static string defaultTripleDesIV = "68Hfwj3kfX=T";
//3DES算法32位加密key,一般存在数据库或文件中
private static string defaultTripleDesKey = "QdpQGoa+8SA9dxhVs6DSXLfUGqw+Ahtd";
/// <summary>
/// Aes加解密钥必须32位,一般存在数据库或文件中
/// </summary>
private static string defaultAesKey = "ZdpQGoa+0SA1dxhVs7DSXLfUGqw-Ahtg";
#region DES加密解密-非机密数据的正式数据加密标准(DES Data Encryption Standard)
//默认密钥向量
//private static readonly byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
#region DES加密
/// <summary>
/// 加密数据
/// </summary>
/// <param name="input">需要加密的字符串</param>
/// <param name="sKey">加密秘钥,不传则默认为指定的值</param>
/// <param name="sIv">加密向量,不传则默认为指定的值</param>
/// <returns></returns>
public static string DESEncrypt(string input, string sKey = "", string sIv = "")
{
if (string.IsNullOrEmpty(input))
return String.Empty;
if (string.IsNullOrEmpty(sKey)) sKey = defaultDesKey;
else if (sKey.Length > 8) sKey = sKey.Substring(0, 8);
if (string.IsNullOrEmpty(sIv)) sIv = defaultDesIv;
else if (sIv.Length > 8) sIv = sIv.Substring(0, 8);
var des = new DESCryptoServiceProvider();
MemoryStream ms = null;
CryptoStream encStream = null;
StreamWriter sw = null;
string result;
try
{
var key = Encoding.UTF8.GetBytes(sKey);
var iv = Encoding.UTF8.GetBytes(sIv);
ms = new MemoryStream();
encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
sw = new StreamWriter(encStream);
sw.Write(input);
sw.Flush();
encStream.FlushFinalBlock();
ms.Flush();
result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, System.Globalization.CultureInfo.InvariantCulture));
}
finally
{
if (sw != null)
sw.Close();
if (encStream != null)
encStream.Close();
if (ms != null)
ms.Close();
}
return result;
}
#endregion
#region DES解密
/// <summary>
/// 解密数据
/// </summary>
/// <param name="input">需要解密的字符串</param>
/// <param name="sKey">加密秘钥,不传则默认为指定的值</param>
/// <param name="sIv">加密向量,不传则默认为指定的值</param>
/// <returns></returns>
public static string DESDecrypt(string input, string sKey = "", string sIv = "")
{
byte[] buffer;
try
{
buffer = Convert.FromBase64String(input);
}
catch (System.ArgumentNullException)
{
return String.Empty;
}
catch (System.FormatException)
{
return String.Empty;
}
var des = new DESCryptoServiceProvider();
MemoryStream ms = null;
CryptoStream encStream = null;
StreamReader sr = null;
var result = String.Empty;
if (string.IsNullOrEmpty(sKey)) sKey = defaultDesKey;
else if (sKey.Length > 8) sKey = sKey.Substring(0, 8);
if (string.IsNullOrEmpty(sIv)) sIv = defaultDesIv;
else if (sIv.Length > 8) sIv = sIv.Substring(0, 8);
try
{
ms = new MemoryStream(buffer);
var key = Encoding.UTF8.GetBytes(sKey);
var iv = Encoding.UTF8.GetBytes(sIv);
encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
sr = new StreamReader(encStream);
result = sr.ReadToEnd();
}
finally
{
if (sr != null)
sr.Close();
if (encStream != null)
encStream.Close();
if (ms != null)
ms.Close();
}
return result;
}
#endregion
#endregion
#region 3DES加密解密-DES增强版
/// <summary>
/// 加密数据-3DES
/// </summary>
/// <param name="input">需要加密的字符串</param>
/// <param name="sKey">加密秘钥,不传则默认为指定的值</param>
/// <param name="sIv">加密向量,不传则默认为指定的值</param>
/// <returns></returns>
public static string TripleDESEncrypt(string input, string sKey = "", string sIv = "")
{
if (string.IsNullOrEmpty(input))
return String.Empty;
if (string.IsNullOrEmpty(sKey)) sKey = defaultTripleDesKey;
else if (sKey.Length > 32) sKey = sKey.Substring(0, 32);
if (string.IsNullOrEmpty(sIv)) sIv = defaultTripleDesIV;
else if (sIv.Length > 12) sIv = sIv.Substring(0, 12);
//创建一个内存流,用于存放密文
&