/// <summary> /// DES/3DES加密 /// </summary> /// <param name="reqData"></param> /// <param name="encryptKey"></param> /// <returns></returns> public static byte[] desEncrypt(byte[] reqDataBytes, byte[] encryptKeyBytes) { int desMode = 0; //1:3des,2:des byte[] encryptDataBytes = null; //加密后的数据 if (encryptKeyBytes.Length == 8) { desMode = 2; } else if (encryptKeyBytes.Length == 16 || encryptKeyBytes.Length == 24) { desMode = 1; } //3DES加密 if (desMode == 1) { TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Padding = PaddingMode.None; //通过反射赋值,绕开弱密钥检查 FieldInfo fi = des.GetType().GetField("KeyValue", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(des, encryptKeyBytes); fi = des.GetType().GetField("KeySizeValue", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(des, encryptKeyBytes.Length * 8); Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform encryptor = (ICryptoTransform)mi.Invoke(des, new object[] { encryptKeyBytes, CipherMode.ECB, null, 0, obj }); encryptDataBytes = encryptor.TransformFinalBlock(reqDataBytes, 0, reqDataBytes.Length); } //DES加密 else if (desMode == 2) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //des.IV = encryptKeyBytes; des.Padding = PaddingMode.None; //通过反射赋值,绕开弱密钥检查 FieldInfo fi = des.GetType().GetField("KeyValue", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(des, encryptKeyBytes); fi = des.GetType().GetField("KeySizeValue", BindingFlags.Instance | BindingFlags.NonPublic); fi.SetValue(des, encryptKeyBytes.Length * 8); Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform encryptor = (ICryptoTransform)mi.Invoke(des, new object[] { encryptKeyBytes, CipherMode.ECB, null, 0, obj }); encryptDataBytes = encryptor.TransformFinalBlock(reqDataBytes, 0, reqDataBytes.Length); } return(encryptDataBytes); }
/// <summary> /// 3DES加密ECB模式(JAVA封装的DES算法的默认模式),支持弱密钥 /// </summary> /// <param name="key"></param> /// <param name="data"></param> /// <returns></returns> public static byte[] TripleDESEncodeECB(byte[] key, byte[] data) { try { MemoryStream mStream = new MemoryStream(); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider(); tdsp.Mode = CipherMode.ECB; //tdsp.Padding = PaddingMode.PKCS7; //tdsp.Key = key; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(tdsp, new object[] { key, CipherMode.ECB, null, 0, obj }); CryptoStream cStream = new CryptoStream(mStream, desCrypt, CryptoStreamMode.Write); cStream.Write(data, 0, data.Length); cStream.FlushFinalBlock(); byte[] ret = mStream.ToArray(); cStream.Close(); mStream.Close(); return(ret);//系统函数是默认24字节,用于3倍长DES算法,目前只用双倍16字节 } catch (CryptographicException e) { Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); return(null); } }
/// <summary> /// 3DES解密ECB模式(JAVA封装的DES算法的默认模式),支持弱密钥 /// </summary> /// <param name="key"></param> /// <param name="data"></param> /// <returns></returns> public static byte[] TripleDESDecodeECB(byte[] key, byte[] data) { try { MemoryStream msDecrypt = new MemoryStream(data); TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider(); tdsp.Mode = CipherMode.CBC; //tdsp.Padding = PaddingMode.PKCS7; //tdsp.Key = key; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(tdsp, new object[] { key, CipherMode.ECB, null, 0, obj }); CryptoStream csDecrypt = new CryptoStream(msDecrypt, desCrypt, CryptoStreamMode.Read); byte[] fromEncrypt = new byte[data.Length]; csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length); return(fromEncrypt); } catch (CryptographicException e) { Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); return(null); } }
/// <summary> /// 3DES解密 /// </summary> /// <returns>解密串</returns> /// <param name="encryptedStr"></param> /// <param name="key"></param> public static string Decrypt3DES(string encryptedStr, string key) { if (string.IsNullOrEmpty(encryptedStr)) { return(encryptedStr); } try { var des = new TripleDESCryptoServiceProvider(); des.Mode = CipherMode.ECB; des.Padding = System.Security.Cryptography.PaddingMode.PKCS7; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform DESDecrypt = (ICryptoTransform) mi.Invoke(des, new object[] { Encoding.ASCII.GetBytes(key), CipherMode.ECB, null, 0, obj }); var new_string = encryptedStr;//FromUrlEnCodeString(a_strString); byte[] Buffer = Convert.FromBase64String(new_string); return(Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))); } catch (System.Exception) { return(string.Empty); } }
//3DES(DESede>Jave)24位KEY /// <summary> /// 3DES加密 /// base64小细节,当使用get请求时,base64生成字符中有“+”号, /// 注意需要转换“%2B”,否则会被替换成空格。POST不存在 /// while (str.IndexOf('+') != -1) { /// str = str.Replace("+","%2B"); // } /// </summary> public static string Encrypt3DES(string content, string key) { if (string.IsNullOrEmpty(content)) { return(content); } try { Encoding encoding = Encoding.GetEncoding("UTF-8"); var des = new TripleDESCryptoServiceProvider(); des.Mode = CipherMode.ECB; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { Encoding.ASCII.GetBytes(key), CipherMode.ECB, null, 0, obj }); byte[] Buffer = encoding.GetBytes(content); return(HttpUtility.UrlEncode(Convert.ToBase64String(desCrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)))); //return ToUrlEnCodeString(Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length))); } catch (System.Exception) { return(string.Empty); } }
public static string TripleDES_DecryptData(byte[] indata, byte[] tdesKey, byte[] iv, CipherMode cm, PaddingMode pm) { TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); byte[] outdata = new byte[tdes.FeedbackSize]; byte[] resdata = new byte[((indata.Length % 8) == 0) ? indata.Length : ((indata.Length / 8) + 1) * 8]; tdes.Mode = cm; tdes.Padding = pm; ICryptoTransform ct = null; if (System.Security.Cryptography.TripleDES.IsWeakKey(tdesKey)) { MethodInfo mi = tdes.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance); object[] par = { tdesKey, tdes.Mode, iv, tdes.FeedbackSize, 1 }; ct = (ICryptoTransform)mi.Invoke(tdes, par); } else { ct = tdes.CreateDecryptor(tdesKey, iv); } int i = 0, o = 0; while ((i + tdes.BlockSize / 8) < indata.Length) { ct.TransformBlock(indata, i, tdes.BlockSize / 8, outdata, 0); Array.Copy(outdata, 0, resdata, o, tdes.BlockSize / 8); i += tdes.BlockSize / 8; o += tdes.BlockSize / 8; } byte[] temp = ct.TransformFinalBlock(indata, i, indata.Length - i); Array.Copy(temp, 0, resdata, o, temp.Length); tdes.Clear(); return(Utils.Bin2AHex(resdata)); }
public static ICryptoTransform CreateWeakEncryptor(this TripleDESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv) { MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance); object[] Par = { key, cryptoProvider.Mode, iv, cryptoProvider.FeedbackSize, 1 }; var trans = mi.Invoke(cryptoProvider, Par) as ICryptoTransform; return(trans); }
/// <summary> /// 3DES-ECB解密,可与其他语言通用 /// </summary> /// <param name="pToDecrypt">16进制待解密数据</param> /// <param name="sKey">16进制密钥 8字节?</param> /// <returns></returns> public static string Des3DecodeECBByAllKey(string pToDecrypt, string sKey) { TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Mode = CipherMode.ECB; des.Padding = PaddingMode.Zeros; byte[] inputByteArray = HexStringToByteArray(pToDecrypt); byte[] inputKey = HexStringToByteArray(sKey); Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo[] methods = des.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); int count = methods.Length; MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance); Object[] param = { inputKey, CipherMode.ECB, null, des.FeedbackSize, obj }; ICryptoTransform DESEncrypt = mi.Invoke(des, param) as ICryptoTransform; //加密得到密文的byte[]形式 byte[] byteResult = DESEncrypt.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length); return(ByteArrayToHexString((byteResult)).Replace(" ", "")); }
public static string TriDesCBCDe(string cipher, string key, string icv = "0000000000000000") { cipher = ConvertTool.RemoveSpace(cipher); key = ConvertTool.RemoveSpace(key); icv = ConvertTool.RemoveSpace(icv); if (key.Length != 32 && key.Length != 48) { throw new Exception("Invalid Key, Not 16 or 24 bytes"); } if (cipher.Length % 16 != 0 || cipher.Length == 0) { throw new Exception("Invalid Cipher, Not 8*n bytes"); } if (icv.Length % 16 != 0) { throw new Exception("Invalid IV, Not 8 bytes"); } TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Padding = PaddingMode.None; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { ConvertTool.String2Bytes(key), CipherMode.CBC, ConvertTool.String2Bytes(icv), 0, obj }); byte[] result = desCrypt.TransformFinalBlock(ConvertTool.String2Bytes(cipher), 0, ConvertTool.String2Bytes(cipher).Length); return(BitConverter.ToString(result).Replace("-", "")); /* TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); * byte[] inputByteArray = ConvertTool.String2Bytes(cipher); * des.Key = ConvertTool.String2Bytes(key); * des.IV = ConvertTool.String2Bytes(icv); * des.Mode = CipherMode.CBC; * des.Padding = System.Security.Cryptography.PaddingMode.None; * MemoryStream ms = new MemoryStream(); * CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), 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();*/ }
public static String Decrypt(byte[] aData, byte[] aKey) { TripleDESCryptoServiceProvider pCipher = new TripleDESCryptoServiceProvider(); pCipher.BlockSize = 64; pCipher.Mode = CipherMode.ECB; pCipher.Padding = PaddingMode.None; pCipher.FeedbackSize = 64; pCipher.GenerateIV(); MethodInfo mi = pCipher.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance); object[] aObj = { aKey, pCipher.Mode, pCipher.IV, pCipher.FeedbackSize, 1 }; ICryptoTransform pTransform = mi.Invoke(pCipher, aObj) as ICryptoTransform; byte[] aResult = pTransform.TransformFinalBlock(aData, 0, aData.Length); pCipher.Clear(); return(UTF8Encoding.UTF8.GetString(aResult)); }
public static string WCPaySignDES3Encode(string data, string key) { TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider(); //DES.KeySize = 16; DES.Mode = CipherMode.CBC; DES.Padding = PaddingMode.Zeros; Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = DES.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); byte[] keys = str2Bcd(key); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(DES, new object[] { keys, CipherMode.CBC, null, 0, obj }); byte[] Buffer = Encoding.UTF8.GetBytes(data); byte[] result = desCrypt.TransformFinalBlock(Buffer, 0, Buffer.Length); return(bcd2Str(result)); }
public string TripleDesEncrypt(string source, string keystr) { byte[] data = Encoding.UTF8.GetBytes(source); byte[] key = GetByteKey(keystr); TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); des.Padding = PaddingMode.PKCS7; //Decrypt Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode"); object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t); MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic); ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj }); byte[] result = desCrypt.TransformFinalBlock(data, 0, data.Length); return(BitConverter.ToString(result).Replace("-", "")); }
/// <summary> /// 3DES-ECB加密,可与其他语言通用 /// </summary> /// <param name="pToDecrypt">16进制待解密数据</param> /// <param name="sKey">16进制密钥 8字节?</param> /// <returns></returns> public static string Des3EncodeECBByAllKey(string pToDecrypt, string sKey) { TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider(); tdsp.Mode = CipherMode.ECB; tdsp.Padding = PaddingMode.Zeros; byte[] inputByteArray = HexStringToByteArray(pToDecrypt); byte[] inputKey = HexStringToByteArray(sKey); MethodInfo mi = tdsp.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance); Object[] param = { inputKey, CipherMode.ECB, null, tdsp.FeedbackSize, 0 }; ICryptoTransform DESEncrypt = mi.Invoke(tdsp, param) as ICryptoTransform; //加密得到密文的byte[]形式 byte[] byteResult = DESEncrypt.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length); return(ByteArrayToHexString((byteResult)).Replace(" ", "")); }