Security.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. using System;
  2. using System.IO;
  3. using System.Security.Cryptography;
  4. using System.Text;
  5. namespace ETD.Data
  6. {
  7. /// <summary>
  8. /// 数据加密类
  9. /// </summary>
  10. public sealed class Security
  11. {
  12. private static byte[] Keys = new byte[] { 0x41, 0x72, 0x65, 0x79, 0x6f, 0x75, 0x6d, 0x79, 0x53, 110, 0x6f, 0x77, 0x6d, 0x61, 110, 0x3f };
  13. /// <summary>
  14. /// 初始化向量变量
  15. /// </summary>
  16. private string m_IV = string.Empty;
  17. /// <summary>
  18. /// 密钥变量
  19. /// </summary>
  20. private string m_Key = string.Empty;
  21. /// <summary>
  22. /// 3DES加密对象的实例
  23. /// </summary>
  24. private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
  25. /// <summary>
  26. /// 构造器
  27. /// </summary>
  28. public Security()
  29. {
  30. this.GetKey();
  31. this.GetIV();
  32. }
  33. /// <summary>
  34. ///
  35. /// </summary>
  36. /// <param name="decryptString"></param>
  37. /// <param name="decryptKey"></param>
  38. /// <returns></returns>
  39. public static string Decode(string decryptString, string decryptKey)
  40. {
  41. try
  42. {
  43. decryptKey = Text.CutString(decryptKey, 0x20, "");
  44. decryptKey = decryptKey.PadRight(0x20, ' ');
  45. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  46. rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
  47. rijndaelProvider.IV = Keys;
  48. ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
  49. byte[] inputData = Convert.FromBase64String(decryptString);
  50. byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
  51. return Encoding.UTF8.GetString(decryptedData);
  52. }
  53. catch
  54. {
  55. return "";
  56. }
  57. }
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. /// <param name="encryptString"></param>
  62. /// <param name="encryptKey"></param>
  63. /// <returns></returns>
  64. public static string Encode(string encryptString, string encryptKey)
  65. {
  66. encryptKey = Text.CutString(encryptKey, 0x20, "");
  67. encryptKey = encryptKey.PadRight(0x20, ' ');
  68. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  69. rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 0x20));
  70. rijndaelProvider.IV = Keys;
  71. ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
  72. byte[] inputData = Encoding.UTF8.GetBytes(encryptString);
  73. return Convert.ToBase64String(rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length));
  74. }
  75. /// <summary>
  76. /// 3DES+异或加密数据
  77. /// </summary>
  78. /// <param name="EncryString">需要解码密的数据</param>
  79. /// <param name="Key">密钥</param>
  80. /// <returns>加密后的数据</returns>
  81. public string Encrypt(string EncryString, string Key)
  82. {
  83. string str = this.Encrypt3DESString(EncryString);
  84. return this.EncryptKey(str, Key, true);
  85. }
  86. /// <summary>
  87. /// 3DES加密数据
  88. /// </summary>
  89. /// <param name="EncryptString">需要加密的数据</param>
  90. /// <returns>加密后的数据</returns>
  91. public string Encrypt3DESString(string EncryptString)
  92. {
  93. StringBuilder p_strEncStr = new StringBuilder();
  94. p_strEncStr.Append(EncryptString);
  95. ICryptoTransform ct = this.mCSP.CreateEncryptor(this.mCSP.Key, this.mCSP.IV);
  96. byte[] byt = Encoding.UTF8.GetBytes(p_strEncStr.ToString());
  97. MemoryStream ms = new MemoryStream();
  98. CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
  99. cs.Write(byt, 0, byt.Length);
  100. cs.FlushFinalBlock();
  101. cs.Close();
  102. return this.GetOut3DESLicense(Convert.ToBase64String(ms.ToArray()));
  103. }
  104. /// <summary>
  105. /// 异或字符串加密方法
  106. /// </summary>
  107. /// <param name="str">需要加密的字符串</param>
  108. /// <param name="key">加密密钥,为空时使用默认密钥</param>
  109. /// <param name="bl">true:使用随机加密因子;false:不使用随机加密因子</param>
  110. /// <returns>返回加密后的字符串</returns>
  111. public string EncryptKey(string str, string key, bool bl)
  112. {
  113. int offset;
  114. int keyLen = key.Length;
  115. if (keyLen == 0)
  116. {
  117. key = "zllscs";
  118. }
  119. int keyPos = 0;
  120. int SrcPos = 0;
  121. int SrcAsc = 0;
  122. Random rd = new Random();
  123. if (bl)
  124. {
  125. offset = rd.Next(0, 0x100);
  126. }
  127. else
  128. {
  129. offset = 14;
  130. }
  131. string dest = string.Format("{0:X2}", offset);
  132. char[] chr = str.ToCharArray();
  133. char[] keychr = key.ToCharArray();
  134. byte[] strBt = Encoding.ASCII.GetBytes(chr);
  135. byte[] keyBt = Encoding.ASCII.GetBytes(keychr);
  136. for (SrcPos = 0; SrcPos < str.Length; SrcPos++)
  137. {
  138. SrcAsc = (strBt[SrcPos] + offset) % 0xff;
  139. if (keyPos < keyLen)
  140. {
  141. SrcAsc ^= keyBt[keyPos];
  142. keyPos++;
  143. }
  144. else
  145. {
  146. keyPos = 0;
  147. SrcAsc ^= keyBt[keyPos];
  148. }
  149. dest = dest + string.Format("{0:X2}", SrcAsc);
  150. offset = SrcAsc;
  151. }
  152. return dest;
  153. }
  154. /// <summary>
  155. /// 输出3DES加密的数据,并将3DES的初始化向量和关键字赋给对应属性
  156. /// </summary>
  157. /// <param name="EnyData">加密的数据</param>
  158. /// <returns>组合好的数据</returns>
  159. private string Get3DESLicenseKey(string EnyData)
  160. {
  161. string p_strKey = EnyData.Substring(20, 0x20);
  162. this.mCSP.Key = Convert.FromBase64String(p_strKey);
  163. EnyData = EnyData.Remove(20, 0x20);
  164. string p_strIV = EnyData.Substring(10, 12);
  165. this.mCSP.IV = Convert.FromBase64String(p_strIV);
  166. EnyData = EnyData.Remove(10, 12);
  167. return EnyData;
  168. }
  169. /// <summary>
  170. /// 获得3DES加密的初始化向量
  171. /// </summary>
  172. private void GetIV()
  173. {
  174. this.mCSP.GenerateIV();
  175. this.IV = Convert.ToBase64String(this.mCSP.IV);
  176. }
  177. /// <summary>
  178. /// 获得3DES加密的密钥
  179. /// </summary>
  180. private void GetKey()
  181. {
  182. this.mCSP.GenerateKey();
  183. this.Key = Convert.ToBase64String(this.mCSP.Key);
  184. }
  185. /// <summary>
  186. /// 3DES组合输出的到文件中的数据
  187. /// </summary>
  188. /// <param name="EnyData">加密的数据</param>
  189. /// <returns>组合好的数据</returns>
  190. private string GetOut3DESLicense(string EnyData)
  191. {
  192. EnyData = EnyData.Insert(10, this.IV);
  193. EnyData = EnyData.Insert(20, this.Key);
  194. return EnyData;
  195. }
  196. /// <summary>
  197. /// Md5加密
  198. /// </summary>
  199. /// <param name="Code">加密的字符串</param>
  200. /// <param name="CodeType">编码方式</param>
  201. /// <returns></returns>
  202. public static string MD5Encode(string Code, string CodeType)
  203. {
  204. MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
  205. byte[] InBytes = Encoding.GetEncoding(CodeType).GetBytes(Code);
  206. byte[] OutBytes = md5.ComputeHash(InBytes);
  207. string OutString = "";
  208. for (int i = 0; i < OutBytes.Length; i++)
  209. {
  210. OutString = OutString + OutBytes[i].ToString("x2");
  211. }
  212. return OutString;
  213. }
  214. /// <summary>
  215. /// 3DES+异或解密数据
  216. /// </summary>
  217. /// <param name="EncryString">需要解密的数据</param>
  218. /// <param name="Key">密钥</param>
  219. /// <returns>加密后的数据</returns>
  220. public string Uncrypt(string EncryString, string Key)
  221. {
  222. string str = this.UncryptKey(EncryString, Key, true);
  223. return this.Uncrypt3DESString(str);
  224. }
  225. /// <summary>
  226. /// 3DES数据解密
  227. /// </summary>
  228. /// <param name="EncryString">需要解密的字符串</param>
  229. /// <returns>解密后的原始数据</returns>
  230. public string Uncrypt3DESString(string EncryString)
  231. {
  232. EncryString = this.Get3DESLicenseKey(EncryString);
  233. ICryptoTransform ct = this.mCSP.CreateDecryptor(this.mCSP.Key, this.mCSP.IV);
  234. byte[] byt = Convert.FromBase64String(EncryString);
  235. MemoryStream ms = new MemoryStream();
  236. CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
  237. cs.Write(byt, 0, byt.Length);
  238. cs.FlushFinalBlock();
  239. cs.Close();
  240. return Encoding.UTF8.GetString(ms.ToArray());
  241. }
  242. /// <summary>
  243. /// 异或字符串加密方法
  244. /// </summary>
  245. /// <param name="str">需要加密的字符串</param>
  246. /// <param name="key">加密密钥,为空时使用默认密钥</param>
  247. /// <param name="bl">true:使用随机加密因子;false:不使用随机加密因子</param>
  248. /// <returns>返回加密后的字符串</returns>
  249. public string UncryptKey(string str, string key, bool bl)
  250. {
  251. string row;
  252. try
  253. {
  254. int offset;
  255. string dest = "";
  256. int keyLen = key.Length;
  257. if (keyLen == 0)
  258. {
  259. key = "zllscs";
  260. }
  261. int keyPos = 0;
  262. int SrcPos = 0;
  263. int SrcAsc = 0;
  264. int TmpSrcAsc = 0;
  265. char[] keychr = key.ToCharArray();
  266. byte[] keyBt = Encoding.ASCII.GetBytes(keychr);
  267. if (bl)
  268. {
  269. offset = Convert.ToInt32("0x" + str.Substring(0, 2), 0x10);
  270. }
  271. else
  272. {
  273. offset = 14;
  274. }
  275. for (SrcPos = 2; SrcPos < str.Length; SrcPos += 2)
  276. {
  277. SrcAsc = Convert.ToInt32("0x" + str.Substring(SrcPos, 2), 0x10);
  278. if (keyPos < keyLen)
  279. {
  280. TmpSrcAsc = SrcAsc ^ keyBt[keyPos];
  281. keyPos++;
  282. }
  283. else
  284. {
  285. keyPos = 0;
  286. TmpSrcAsc = SrcAsc ^ keyBt[keyPos];
  287. }
  288. if (TmpSrcAsc <= offset)
  289. {
  290. TmpSrcAsc = (0xff + TmpSrcAsc) - offset;
  291. }
  292. else
  293. {
  294. TmpSrcAsc -= offset;
  295. }
  296. dest = dest + Convert.ToChar(TmpSrcAsc);
  297. offset = SrcAsc;
  298. }
  299. row = dest;
  300. }
  301. catch (Exception e)
  302. {
  303. throw new Exception(e.Message);
  304. }
  305. return row;
  306. }
  307. /// <summary>
  308. /// 初始化向量字符串形式
  309. /// </summary>
  310. private string IV
  311. {
  312. get
  313. {
  314. return this.m_IV;
  315. }
  316. set
  317. {
  318. this.m_IV = value;
  319. }
  320. }
  321. /// <summary>
  322. /// 密钥字符串形式
  323. /// </summary>
  324. private string Key
  325. {
  326. get
  327. {
  328. return this.m_Key;
  329. }
  330. set
  331. {
  332. this.m_Key = value;
  333. }
  334. }
  335. }
  336. }