/// <summary> /// 随机打乱字符串中的所有字符 /// </summary> /// <param name="str">需要被打乱的字符串</param> /// <param name="seed">种子</param> /// <returns>被打乱的字符串</returns> public static string Shuffle(string str, int?seed = null) { KGuard.Requires <ArgumentNullException>(str != null); var random = KUtil.MakeRandom(seed); var requested = new string[str.Length]; for (var i = 0; i < str.Length; i++) { var index = random.Next(0, str.Length - 1); requested[i] = requested[i] ?? str.Substring(i, 1); requested[index] = requested[index] ?? str.Substring(index, 1); if (index == i) { continue; } var temp = requested[i]; requested[i] = requested[index]; requested[index] = temp; } return(KArray.Reduce(requested, (v1, v2) => v1 + v2, string.Empty)); }
/// <summary> /// 加密 /// </summary> /// <param name="content">加密内容</param> /// <param name="key">密钥</param> /// <returns></returns> public string Encrypt(byte[] content, byte[] key) { rijndaelManaged.GenerateIV(); var aesEncrypt = rijndaelManaged.CreateEncryptor(key, rijndaelManaged.IV); var aesBuffer = aesEncrypt.TransformFinalBlock(content, 0, content.Length); var ivAesBuffer = KArray.Merge(rijndaelManaged.IV, aesBuffer); return(Encode(Convert.ToBase64String(rijndaelManaged.IV), Convert.ToBase64String(aesBuffer), Convert.ToBase64String(HMac(ivAesBuffer, key)))); }
/// <summary> /// 解密被加密的内容 /// </summary> /// <param name="str">需要解密的字符串</param> /// <param name="key">密钥</param> /// <returns>解密后的值</returns> public byte[] Decrypt(string str, byte[] key) { string iv, value, hmac; Decode(str, out iv, out value, out hmac); var aesBuffer = Convert.FromBase64String(value); var ivBuffer = Convert.FromBase64String(iv); var ivAesBuffer = KArray.Merge(rijndaelManaged.IV, aesBuffer); if (Convert.ToBase64String(HMac(ivAesBuffer, key)) != hmac) { throw new Exception("HMac validation failed"); } var aesDecrypt = rijndaelManaged.CreateDecryptor(key, ivBuffer); aesBuffer = aesDecrypt.TransformFinalBlock(aesBuffer, 0, aesBuffer.Length); return(aesBuffer); }