public class CipherHelper
{
/// <summary>
/// Hash 加密采用的算法
/// </summary>
public enum HashFormat
{
MD516,
MD532,
SHA1,
SHA256,
SHA384,
SHA512
};
/// <summary>
/// 对称加密采用的算法
/// </summary>
public enum SymmetricFormat
{
DES,
TripleDES
};
/// <summary>
/// 对字符串进行 Hash 加密
/// </summary>
public static string Hash(string inputString, HashFormat hashFormat)
{
HashAlgorithm algorithm = null;
switch (hashFormat)
{
case HashFormat.MD516:
algorithm = MD5.Create();
break;
case HashFormat.MD532:
algorithm = MD5.Create();
break;
case HashFormat.SHA1:
algorithm = SHA1.Create();
break;
case HashFormat.SHA256:
algorithm = SHA256.Create();
break;
case HashFormat.SHA384:
algorithm = SHA384.Create();
break;
case HashFormat.SHA512:
algorithm = SHA512.Create();
break;
}
algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
if (hashFormat == HashFormat.MD516)
{
return BitConverter.ToString(algorithm.Hash).Replace("-", "").Substring(8, 16).ToUpper();
}
else
{
return BitConverter.ToString(algorithm.Hash).Replace("-", "").ToUpper();
}
}
public static string HMACSHA(string message, string secret)
{
byte[] secretKey = Encoding.UTF8.GetBytes(secret);
HMACSHA256 hmac = new HMACSHA256(secretKey);
hmac.Initialize();
byte[] bytes = Encoding.UTF8.GetBytes(message);
byte[] rawHmac = hmac.ComputeHash(bytes);
return ToHexString(rawHmac);
}
/// <summary>
/// java中Hex.encodeHexString方法的c#实现
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
public static string ToHexString(byte[] bytes) // 0xae00cf => "AE00CF "
{
string hexString = string.Empty;
if (bytes != null)
{
StringBuilder strB = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
strB.Append(bytes[i].ToString("X2"));
}
hexString = strB.ToString();
}
return hexString;
}
/// <summary>
/// 对字符串进行对称加密
/// </summary>
public static string SymmetricEncrypt(string inputString, SymmetricFormat symmetricFormat, string key, string iv)
{
SymmetricAlgorithm algorithm = null;
switch (symmetricFormat)
{
case SymmetricFormat.DES:
algorithm = DES.Create();
break;
case SymmetricFormat.TripleDES:
algorithm = TripleDES.Create();
break;
}
int keySize = algorithm.Key.Length;
byte[] desString = Encoding.UTF8.GetBytes(inputString);
byte[] desKey = Encoding.UTF8.GetBytes(key.Substring(0, keySize));
byte[] desIV = Encoding.UTF8.GetBytes(iv.Substring(0, keySize));
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, algorithm.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
cStream.Write(desString, 0, desString.Length);
cStream.FlushFinalBlock();
cStream.Close();
//return Convert.ToBase64String(mStream.ToArray());
return BitConverter.ToString(mStream.ToArray()).Replace("-", "").ToUpper();
}
/// <summary>
/// 对字符串进行对称解密
/// </summary>
public static string SymmetricDecrypt(string inputString, SymmetricFormat symmetricFormat, string key, string iv)
{
SymmetricAlgorithm algorithm = null;
switch (symmetricFormat)
{
case SymmetricFormat.DES:
algorithm = DES.Create();
break;
case SymmetricFormat.TripleDES:
algorithm = TripleDES.Create();
break;
}
int keySize = algorithm.Key.Length;
//byte[] desString = Convert.FromBase64String(inputString);
byte[] desString = new byte[inputString.Length / 2];
for (int i = 0; i < inputString.Length; i += 2)
{
desString[i / 2] = byte.Parse(inputString.Substring(i, 2), System.Globalization.NumberStyles.AllowHexSpecifier);
}
byte[] desKey = Encoding.UTF8.GetBytes(key.Substring(0, keySize));
byte[] desIV = Encoding.UTF8.GetBytes(iv.Substring(0, keySize));
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, algorithm.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write);
cStream.Write(desString, 0, desString.Length);
cStream.FlushFinalBlock();
cStream.Close();
return Encoding.UTF8.GetString(mStream.ToArray());
}
/// <summary>
/// RSA 加密
/// </summary>
public static string Rsa(string PublicRsaKey, string source)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(PublicRsaKey);
var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(source), true);
return Convert.ToBase64String(cipherbytes);
}
/// <summary>
/// RSA解密
/// </summary>
public static string UnRsa(string PrivateRsaKey, string source)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(PrivateRsaKey);
var cipherbytes = rsa.Decrypt(Convert.FromBase64String(source), true);
return Encoding.UTF8.GetString(cipherbytes);
}
/// <summary>
/// Base64解密
/// </summary>
/// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param>
/// <param name="result">待解密的密文</param>
/// <returns>解密后的字符串</returns>
public static string DecodeBase64(Encoding encode, string result)
{
string decode = "";
byte[] bytes = Convert.FromBase64String(result);
try
{
decode = encode.GetString(bytes);
}
catch
{
decode = result;
}
return decode;
}
/// <summary>
/// Base64加密
/// </summary>
/// <param name="Message"></param>
/// <returns></returns>
public static string Base64Code(string Message)
{
byte[] bytes = Encoding.Default.GetBytes(Message);
return Convert.ToBase64String(bytes);
}
}