using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace Top.Api.Util
{
///
/// 安全工具类
///
public abstract class SecurityUtil
{
private static readonly char[] CA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray();
private static readonly int[] IA = InitIA();
private static readonly int KeySize = 128;
private static readonly int BlockSize = 128;
private static readonly byte[] IvBytes = Encoding.UTF8.GetBytes("0102030405060708");//初始向量
private static int[] InitIA()
{
int len = 256;
int[] a = new int[len];
for (int i = 0; i < len; i++)
{
a[i] = -1;
}
for (int i = 0, iS = CA.Length; i < iS; i++)
{
a[CA[i]] = i;
}
a['='] = 0;
return a;
}
///
/// 判断是否base64值
///
///
///
public static bool IsBase64Value(string str)
{
// Check special case
int sLen = str != null ? str.Length : 0;
if (sLen == 0)
return false;
// Count illegal characters (including '\r', '\n') to know what size the returned array will be,
// so we don't have to reallocate & copy it later.
int sepCnt = 0; // Number of separator characters. (Actually illegal characters, but that's a bonus...)
for (int i = 0; i < sLen; i++) // If input is "pure" (I.e. no line separators or illegal chars) base64 this loop can be commented out.
{
char currentChar = str[i];
if (currentChar >= IA.Length) {
return false;
}
if (IA[currentChar] < 0) {
sepCnt++;
}
}
// Check so that legal chars (including '=') are evenly divideable by 4 as specified in RFC 2045.
if ((sLen - sepCnt) % 4 != 0)
{
return false;
}
return true;
}
///
/// 生成滑动窗口
///
/// 数据
/// 分词大小
/// 分词元素
public static List GetSlideWindows(string input, int slideSize)
{
List windows = new List();
int startIndex = 0;
int endIndex = 0;
int currentWindowSize = 0;
string currentWindow = null;
while (endIndex < input.Length || currentWindowSize > slideSize)
{
bool startsWithLetterOrDigit;
if (currentWindow == null)
{
startsWithLetterOrDigit = false;
}
else
{
startsWithLetterOrDigit = IsLetterOrDigit(currentWindow[0]);
}
if (endIndex == input.Length && !startsWithLetterOrDigit)
{
break;
}
if (currentWindowSize == slideSize && !startsWithLetterOrDigit && IsLetterOrDigit(input[endIndex]))
{
endIndex++;
currentWindow = input.Substring(startIndex, endIndex - startIndex);
currentWindowSize = 5;
}
else
{
if (endIndex != 0)
{
if (startsWithLetterOrDigit)
{
currentWindowSize -= 1;
}
else
{
currentWindowSize -= 2;
}
startIndex++;
}
while (currentWindowSize < slideSize && endIndex < input.Length)
{
char currentChar = input[endIndex];
if (IsLetterOrDigit(currentChar))
{
currentWindowSize += 1;
}
else
{
currentWindowSize += 2;
}
endIndex++;
}
currentWindow = input.Substring(startIndex, endIndex - startIndex);
}
windows.Add(currentWindow);
}
return windows;
}
///
/// 判断是否小写字母
///
///
///
private static bool IsLetterOrDigit(char x)
{
if (0 <= x && x <= 127)
{
return true;
}
return false;
}
///
/// 压缩
///
///
///
///
private static byte[] Compress(byte[] input, int toLength)
{
if (toLength < 0)
{
return null;
}
byte[] output = new byte[toLength];
for (int i = 0; i < output.Length; i++)
{
output[i] = 0;
}
for (int i = 0; i < input.Length; i++)
{
int index_output = i % toLength;
output[index_output] ^= input[i];
}
return output;
}
///
/// Base64加密
///
/// 待加密的明文
/// 编码方式
///
public static string EncodeBase64(string source, Encoding encode)
{
byte[] bytes = encode.GetBytes(source);
return Convert.ToBase64String(bytes);
}
///
/// Base64加密
///
/// 待加密的明文
///
///
///
/// 参看SecurityUtil.EncodeBase64(string,Encoding)方法的说明
public static string EncodeBase64(string source)
{
return EncodeBase64(source, Encoding.UTF8);
}
///
/// AES加密
///
/// 待加密的内容
/// 加密密钥
///
public static string AESEncrypt(string context, byte[] keyBytes)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = KeySize;
rijndaelCipher.BlockSize = KeySize;
// 加密密钥
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = IvBytes;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(context);
byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
return Convert.ToBase64String(cipherBytes);
}
///
/// AES解密
///
///
///
///
public static string AESDecrypt(string context, byte[] keyBytes)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = KeySize;
rijndaelCipher.BlockSize = BlockSize;
byte[] encryptedData = Convert.FromBase64String(context);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = IvBytes;
ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
return Encoding.UTF8.GetString(plainText);
}
public static byte[] HmacMD5Encrypt(String encryptText, byte[] encryptKey)
{
HMACMD5 hmac = new HMACMD5(encryptKey);
byte[] bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(encryptText));
return bytes;
}
///
/// 生成BASE64(H_MAC)
///
/// 被签名的字符串
/// 秘钥
///
public static string HmacMD5EncryptToBase64(string encryptText, byte[] encryptKey)
{
return Convert.ToBase64String(HmacMD5Encrypt(encryptText, encryptKey));
}
///
/// 生成BASE64(H_MAC),压缩H_MAC值
///
///
///
///
///
public static String HmacMD5EncryptToBase64(string encryptText, byte[] encryptKey, int compressLen)
{
return Convert.ToBase64String(Compress(HmacMD5Encrypt(encryptText, encryptKey), compressLen));
}
}
}