1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. using Exam.EncryptPrivate;
  7.  
  8. using System.Text;
  9. using System.Security.Cryptography;
  10.  
  11. /// <summary>
  12. /// Aes加密、解密,密钥长度256,密钥长度不大于32个字节
  13. /// </summary>
  14. public class AesCryptoHelper
  15. {
  16. public const string RET_ERROR = "x07x07x07x07x07";
  17. private const string CRYPTO_IV = "XIANJIAN";
  18. private const string CRYPTO_KEY = "XIANJIAN";
  19. private const int CRYPTO_KEY_LENGTH = ;
  20. private const int CRYPTO_IV_LENGTH = ;
  21.  
  22. private AesCryptoServiceProvider m_aesCryptoServiceProvider;
  23. private string m_message;
  24. public string Message
  25. {
  26. get { return m_message; }
  27. set { m_message = value; }
  28. }
  29.  
  30. private bool m_containKey;
  31.  
  32. /// <summary>
  33. /// True:密文中包含密钥
  34. /// False:密文中不包含密钥
  35. /// </summary>
  36. public bool ContainKey
  37. {
  38. get { return m_containKey; }
  39. set { m_containKey = value; }
  40. }
  41.  
  42. public AesCryptoHelper()
  43. {
  44. m_aesCryptoServiceProvider = new AesCryptoServiceProvider();
  45. m_containKey = true;
  46. m_message = string.Empty;
  47. }
  48.  
  49. public AesCryptoHelper(bool containKey):this()
  50. {
  51. m_containKey = containKey;
  52. }
  53.  
  54. private string Encrypt(string s_crypto, byte[] key, byte[] iv)
  55. {
  56. string s_encryped = string.Empty;
  57. byte[] crypto, encrypted;
  58. ICryptoTransform ct;
  59.  
  60. try
  61. {
  62. crypto = string2Byte(s_crypto);
  63. m_aesCryptoServiceProvider.Key = key;
  64. m_aesCryptoServiceProvider.IV = iv;
  65. ct = m_aesCryptoServiceProvider.CreateEncryptor();
  66. encrypted = ct.TransformFinalBlock(crypto, , crypto.Length);
  67.  
  68. if (m_containKey)
  69. {
  70. s_encryped += byte2HexString(key);
  71. }
  72.  
  73. s_encryped += byte2HexString(encrypted);
  74. return s_encryped;
  75. }
  76.  
  77. catch (Exception ex)
  78. {
  79. m_message = ex.ToString();
  80. return RET_ERROR;
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 指定密钥对明文进行AES加密
  86. /// </summary>
  87. /// <param name="s_crypto">明文</param>
  88. /// <param name="s_key">加密密钥</param>
  89. /// <returns></returns>
  90. public string Encrypt(string s_crypto, string s_key)
  91. {
  92. byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
  93. byte[] temp = string2Byte(s_key);
  94.  
  95. if (temp.Length > key.Length)
  96. {
  97. m_message = "Key too long,need less than 32 Bytes key.";
  98. return RET_ERROR;
  99. }
  100.  
  101. key = string2Byte(s_key.PadRight(key.Length));
  102. iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
  103. return Encrypt(s_crypto, key, iv);
  104. }
  105.  
  106. /// <summary>
  107. /// 动态生成密钥,并对明文进行AES加密
  108. /// </summary>
  109. /// <param name="s_crypto">明文</param>
  110. /// <returns></returns>
  111. public string Encrypt(string s_crypto)
  112. {
  113. byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
  114. m_aesCryptoServiceProvider.GenerateKey();
  115. key = m_aesCryptoServiceProvider.Key;
  116. iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
  117. return Encrypt(s_crypto, key, iv);
  118. }
  119.  
  120. private string Decrypt(string s_encrypted, byte[] key, byte[] iv)
  121. {
  122. string s_decrypted = string.Empty;
  123. byte[] encrypted, decrypted;
  124. ICryptoTransform ct;
  125. try
  126. {
  127. encrypted = hexString2Byte(s_encrypted);
  128. m_aesCryptoServiceProvider.Key = key;
  129. m_aesCryptoServiceProvider.IV = iv;
  130. ct = m_aesCryptoServiceProvider.CreateDecryptor();
  131. decrypted = ct.TransformFinalBlock(encrypted, , encrypted.Length);
  132. s_decrypted += byte2String(decrypted);
  133. return s_decrypted;
  134. }
  135. catch (Exception ex)
  136. {
  137. m_message = ex.ToString();
  138. m_message = "Decrypt fail.";
  139. return RET_ERROR;
  140. }
  141. }
  142.  
  143. /// <summary>
  144. /// 从密文中解析出密钥,并对密文进行解密
  145. /// </summary>
  146. /// <param name="s_encrypted">密文</param>
  147. /// <returns></returns>
  148. public string Decrypt(string s_encrypted)
  149. {
  150. string s_key = string.Empty;
  151. byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
  152. if (s_encrypted.Length <= CRYPTO_KEY_LENGTH * )
  153. {
  154. m_message = "Encrypted string invalid.";
  155. return RET_ERROR;
  156. }
  157.  
  158. if (m_containKey)
  159. {
  160. s_key = s_encrypted.Substring(, CRYPTO_KEY_LENGTH * );
  161. s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * );
  162. }
  163.  
  164. key = hexString2Byte(s_key);
  165. iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
  166. return Decrypt(s_encrypted, key, iv);
  167. }
  168.  
  169. /// <summary>
  170. /// 指定密钥,并对密文进行解密
  171. /// </summary>
  172. /// <param name="s_encrypted">密文</param>
  173. /// <param name="s_key">密钥</param>
  174. /// <returns></returns>
  175. public string Decrypt(string s_encrypted, string s_key)
  176. {
  177. byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
  178. byte[] temp = string2Byte(s_key);
  179. if (temp.Length > key.Length)
  180. {
  181. m_message = "Key invalid.too long,need less than 32 Bytes";
  182. return RET_ERROR;
  183. }
  184.  
  185. key = string2Byte(s_key.PadRight(key.Length));
  186. iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
  187. if (m_containKey)
  188. {
  189. s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * );
  190. }
  191.  
  192. return Decrypt(s_encrypted, key, iv);
  193. }
  194.  
  195. private string byte2HexString(byte[] bytes)
  196. {
  197. StringBuilder sb = new StringBuilder();
  198. foreach (byte b in bytes)
  199. {
  200. sb.AppendFormat("{0:X2}", b);
  201. }
  202.  
  203. return sb.ToString();
  204. }
  205.  
  206. private byte[] hexString2Byte(string hex)
  207. {
  208. int len = hex.Length / ;
  209. byte[] bytes = new byte[len];
  210.  
  211. for (int i = ; i < len; i++)
  212. {
  213. bytes[i] = (byte)(Convert.ToInt32(hex.Substring(i * , ), ));
  214. }
  215. return bytes;
  216. }
  217.  
  218. private byte[] string2Byte(string str)
  219. {
  220. return Encoding.UTF8.GetBytes(str);
  221. }
  222.  
  223. private string byte2String(byte[] bytes)
  224. {
  225. return Encoding.UTF8.GetString(bytes);
  226. }
  227. }

C# 之 AES加密源码的更多相关文章

  1. md5 32位小写加密源码

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * md5 32位小写加密 ...

  2. 【转】asp.net(c#)加密解密算法之sha1、md5、des、aes实现源码详解

    原文地址:http://docode.top/Article/Detail/10003 目录: 1..Net(C#)平台下Des加密解密源代码 2..Net(C#)平台下Aes加密解密源代码 3..N ...

  3. net reactor加密源码保软件安全-net reactor使用教程

    上一次介绍用 Xenocode Postbuild for .NET 混淆加密源代码确保软件安全,本篇将讨论用 Eziriz .NET Reactor 混淆加密软件源代码,为从未用过该软件加密的用户分 ...

  4. Python实现基于DES加密源码的文本加密器

    这是自行制作的一个DES文本加密工具 最终效果图: 本加密器支持UTF-8字符的加解密(包含中文),由于其中的编码方式与常用编码方式不同,加密结果与网上工具不同,但是能实现正常加解密. 最终目标: 目 ...

  5. MD5加密源码!

    import java.security.*; class MD5{ public final static String MD5(String s){ char hexDigits[] = {'0' ...

  6. python爬虫破解带有CryptoJS的aes加密的反爬机制

    发现问题 在一次偶然中,在爬取某个公开网站(非商业型网站)时,老方法,打开调试工具查看请求方式,请求拦截,是否是异步加载,不亦乐乎,当我以为这个网站非常简单的时候,发现二级网页的地址和源码不对应 Aj ...

  7. Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

    因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这 ...

  8. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  9. 使用AES加密的勒索类软件分析报告

    报告名称:  某勒索类软件分析报告    作者:        李东 报告更新日期: 样本发现日期: 样本类型: 样本文件大小/被感染文件变化长度: 样本文件MD5 校验值: da4ab5e31793 ...

随机推荐

  1. SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法

    转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...

  2. C#.NET开源项目、机器学习、商务智能

    所以原谅我,不能把所有的都发上来,太杂了,反而不好. 1..NET时间周期处理组件 这个组件很小,主要是对时间日期,特别是处理时间间隔以及时间范围非常方便.虽然.NET自带了时间日期的部分功能,但可能 ...

  3. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  4. SQL日志文件的作用

    服务器意外关闭造成的损失.服务器意外关闭造成的损失.解决数据一致性问题.数据库时点恢复的问题,这四个常见的问题,SQL Server数据库管理员,可以通过了解数据日志文件,轻松排除故障. 当系统出现故 ...

  5. Eclipse(非J2EE版本)配置Extjs环境以及安装部署Tomcat

    Eclipse(非J2EE版本)配置Extjs环境(Spket) 1. 安装spket插件,帮助->安装新软件->http://www.agpad.com/update. 2. 设置Spk ...

  6. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2222  Solved: 1082[Submit][Statu ...

  7. [学姿势]实验室搬砖+node学习

    这周开始进行收尾工作,我当然没有进行核心技术的开发,主要负责的是对web端进行展示上的修修补补,主要包括添加VLC播放器.rtsp视频流以及一些js细节. 1.VLC 全称为Video Lan Cli ...

  8. cache 的简单认识与思考

    之前对NOSQL的总结是:基本功能是key-value, 然后各自附加特殊功能. 现在简单的来认识一下cache. 背景 大家都知道NoSQL, 大多数都是 key-value 型的数据库.有些内存型 ...

  9. 转载 DNS查询流程简介

    转载请注明出处:http://blog.csdn.net/luotuo44/article/details/45545059 DNS(domain name system),读者们或多或少都听过,就是 ...

  10. 依賴注入入門——Unity(一)

    參考資料http://blog.csdn.net/m13666368773/article/details/7802126 背景介紹 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系, ...