一.System.Security.Cryptography 命名空间
System.Security.Cryptography 命名空间提供加密服务,包括安全编码和解码的数据,以及许多其他操作,如哈希、 随机数字生成和消息身份验证。
Microsoft官方网址:https://msdn.microsoft.com/zh-cn/library/system.security.cryptography(v=vs.110).aspx
其中提供了des加密解密算法、HMAC、HMACSHA1、MD5、RSA 、SHA1等算法基础类。
二.部分算法代码介绍
1.单向加密--只有加密,没有解密。
1.1.MD5加密
参考代码:
private string GetMD5(string text)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
md5.Clear();
StringBuilder str = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
str.Append(data[i].ToString("X").PadLeft(2, '0'));
}
return str.ToString();
}
2.双向加密--既有加密又可以解密
2.1.对称性加密算法--使用提前商定好的密钥进行加密以及解密
2.1.1.DES加密
方法一:
/// <summary>
/// 加密数据
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text);
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}
方法二:
/// <summary>
/// DES ECB模式加密
/// </summary>
/// <param name="key">密钥</param>
/// <param name="iv">IV(当模式为ECB时,IV无用)</param>
/// <param name="str">明文的byte数组</param>
/// <returns>密文的byte数组</returns>
private string DesEncodeECB(string skey, string sdata)
{
try
{
string encryptKey = "";
if (skey.Length >= 8)
{
encryptKey = skey.Substring(0, 8);
}
else
{
encryptKey = skey;
}
byte[] key = Encoding.Default.GetBytes(encryptKey);
byte[] data = Encoding.Default.GetBytes(sdata);
// Create a MemoryStream.
MemoryStream mStream = new MemoryStream();
DESCryptoServiceProvider tdsp = new DESCryptoServiceProvider();
tdsp.Mode = CipherMode.ECB;
tdsp.Padding = PaddingMode.PKCS7;
CryptoStream cStream = new CryptoStream(mStream,
tdsp.CreateEncryptor(key, key),
CryptoStreamMode.Write);
cStream.Write(data, 0, data.Length);
cStream.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in mStream.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
cStream.Close();
mStream.Close();
return ret.ToString();
}
catch (CryptographicException e)
{
stCommon.Errors.Logs("皇包车接口中,des加密出现异常!----" + e.StackTrace + e.Message);
return null;
}
}
2.1.2.DES解密
方法一:
/// <summary>
/// 解密数据
/// </summary>
/// <param name="Text"></param>
/// <param name="sKey"></param>
/// <returns></returns>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
方法二:
/// <summary>
/// DES ECB模式解密
/// </summary>
/// <param name="key">密钥</param>
/// <param name="iv">IV(当模式为ECB时,IV无用)</param>
/// <param name="str">密文的byte数组</param>
/// <returns>明文的byte数组</returns>
private string DesDecodeECB(string skey, string sdata)
{
try
{
string encryptKey = skey.Substring(0, 8);
byte[] key = Encoding.Default.GetBytes(encryptKey);
byte[] data = Encoding.Default.GetBytes(sdata);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = sdata.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(sdata.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, key), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
catch (CryptographicException e)
{
stCommon.Errors.Logs("皇包车接口中,des解密出现异常!----" + e.StackTrace + e.Message);
return null;
}
}
2.2非对称性加密算法
发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
加密算法有RSA,DSA,ECC
注:自己见解,如有错误请指出。如有补充,请写在评论区,谢谢!