static bool Validation(string validateKey, string iv, string cypher, string hash) { var needToHash = CryptoExtensions.HexToBinary(iv + cypher); if (needToHash == null) { return(false); } var key = CryptoExtensions.HexToBinary(validateKey); if (key == null) { return(false); } var hashData = CryptoExtensions.HexToBinary(hash); if (hashData == null) { return(false); } using (var keyedValidationAlgorithm = new HMACSHA256(key)) { var computed = keyedValidationAlgorithm.ComputeHash(needToHash); return(CryptoExtensions.BuffersAreEqual(hashData, 0, hashData.Length, computed, 0, hashData.Length)); } }
public static string ProtectData(string encryptKey, string validateKey, string clearData, string ivStr = null) { using (var rj = new RijndaelManaged()) { rj.Padding = PaddingMode.PKCS7; rj.Mode = CipherMode.CBC; rj.KeySize = 256;// 128; rj.BlockSize = 128; rj.Key = CryptoExtensions.HexToBinary(encryptKey); byte[] iv; if (ivStr == null) { rj.GenerateIV(); iv = rj.IV; } else { iv = CryptoExtensions.HexToBinary(ivStr); rj.IV = iv; } var data = Encoding.UTF8.GetBytes(clearData); using (var memoryStream = new MemoryStream()) { //先将向量写入加密流头部 memoryStream.Write(iv, 0, iv.Length); using (var encryptor = rj.CreateEncryptor()) using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { //写入加密字节流 cryptoStream.Write(data, 0, data.Length); cryptoStream.FlushFinalBlock(); //计算当前字节流的Hash值,并写入流末端 using (KeyedHashAlgorithm validationAlgorithm = new HMACSHA256(CryptoExtensions.HexToBinary(validateKey))) { var hash = validationAlgorithm.ComputeHash( memoryStream.GetBuffer(), 0, checked ((int)memoryStream.Length)); memoryStream.Write(hash, 0, 8); return(CryptoExtensions.BinaryToHex(memoryStream.ToArray())); } } } } }
static string DecryptRj128(string cypher, string keyString, string ivString) { var key = CryptoExtensions.HexToBinary(keyString); var iv = CryptoExtensions.HexToBinary(ivString); var data = CryptoExtensions.HexToBinary(cypher); using (var rj = new RijndaelManaged()) { rj.Padding = PaddingMode.PKCS7; rj.Mode = CipherMode.CBC; rj.KeySize = 256;// 128; rj.BlockSize = 128; rj.Key = key; rj.IV = iv; using (var ms = new MemoryStream(data)) using (var cs = new CryptoStream(ms, rj.CreateDecryptor(key, iv), CryptoStreamMode.Read)) using (var sr = new StreamReader(cs)) { return(sr.ReadToEnd()); } } }