1. /// <summary>
  2. /// AES对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB),这三种的区别,主要来自于密钥的长度,16位密钥=128位,24位密钥=192位,32位密钥=256位
  3. /// 检验密钥是否有效长度【16|24|32】
  4. /// </summary>
  5. /// <param name="key">密钥</param>
  6. /// <returns>bool</returns>
  7. private static bool AesCheckKey(string key)
  8. {
  9. if (string.IsNullOrWhiteSpace(key))
  10. return false;
  11. if (.Equals(key.Length) || .Equals(key.Length) || .Equals(key.Length))
  12. return true;
  13. else
  14. return false;
  15. }
  16.  
  17. #region 参数是string类型的
  18. /// <summary>
  19. ///  AES加密 参数:string
  20. /// </summary>
  21. /// <param name="source">源字符串</param>
  22. /// <param name="key">密钥</param>
  23. /// <param name="base64">是否转64进制</param>
  24. /// <param name="model">运算模式</param>
  25. /// <param name="padding">填充模式</param>
  26. /// <param name="encoding">编码类型</param>
  27. /// <returns>加密后的字符串</returns>
  28. public static string AesEncrypt(string source, string key, bool base64 = false, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
  29. {
  30. if (string.IsNullOrWhiteSpace(source)) return null;
  31. if (!AesCheckKey(key)) return source;
  32. if (encoding == null) encoding = Encoding.UTF8;
  33. using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
  34. {
  35. aesProvider.Key = encoding.GetBytes(key);
  36. aesProvider.Mode = model;
  37. aesProvider.Padding = padding;
  38. //aesProvider.KeySize = 128;
  39. //aesProvider.BlockSize = 128;
  40. using (ICryptoTransform cryptoTransform = aesProvider.CreateEncryptor())
  41. {
  42. byte[] toEncryptArray = encoding.GetBytes(source);
  43. byte[] resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length);
  44. aesProvider.Clear();
  45. //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
  46. return base64 ? Convert.ToBase64String(resultArray) : byteToHexString(resultArray);
  47. }
  48. }
  49.  
  50. //RijndaelManaged rijndaelCipher = new RijndaelManaged();
  51. //rijndaelCipher.Mode = CipherMode.ECB;
  52. //rijndaelCipher.Padding = PaddingMode.PKCS7;
  53. //rijndaelCipher.KeySize = 128;
  54. //rijndaelCipher.BlockSize = 128;
  55. //byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
  56. //byte[] keyBytes = new byte[16];
  57. //int len = pwdBytes.Length;
  58. //if (len > keyBytes.Length) len = keyBytes.Length;
  59. //System.Array.Copy(pwdBytes, keyBytes, len);
  60. //rijndaelCipher.Key = keyBytes;
  61. ////加密初始化向量
  62. //string iv = " ";
  63. //byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
  64. //rijndaelCipher.IV = new byte[16];
  65. //ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
  66. //byte[] plainText = System.Text.Encoding.UTF8.GetBytes(source);
  67. //byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
  68. //return byteToHexString(cipherBytes);// Convert.ToBase64String(cipherBytes);
  69. }
  70.  
  71. /// <summary>
  72. ///  AES解密 参数:string
  73. /// </summary>
  74. /// <param name="source">源字符串</param>
  75. /// <param name="key">密钥</param>
  76. /// <param name="base64">是否转64进制</param>
  77. /// <param name="model">运算模式</param>
  78. /// <param name="padding">填充模式</param>
  79. /// <param name="encoding">编码类型</param>
  80. /// <returns>解密后的字符串</returns>
  81. public static string AesDecrypt(string source, string key, bool base64 = false, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
  82. {
  83. if (string.IsNullOrWhiteSpace(source)) return null;
  84. if (!AesCheckKey(key)) return source;
  85. if (encoding == null) encoding = Encoding.UTF8;
  86. using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
  87. {
  88. aesProvider.Key = encoding.GetBytes(key);
  89. aesProvider.Mode = model;
  90. aesProvider.Padding = padding;
  91. //aesProvider.KeySize = 128;
  92. //aesProvider.BlockSize = 128;
  93. using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
  94. {
  95. byte[] toEncryptArray = base64 == true ? Convert.FromBase64String(source) : stringToHexByte(source);
  96. byte[] resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, , toEncryptArray.Length);
  97. aesProvider.Clear();
  98. return encoding.GetString(resultArray);
  99. }
  100. }
  101. }
  102. #endregion
  103.  
  104. /// <summary>
  105. /// 字节数组转16进制字符串
  106. /// </summary>
  107. /// <param name="bytes"></param>
  108. /// <returns></returns>
  109. public static string byteToHexString(byte[] bytes)
  110. {
  111. string returnStr = "";
  112. if (bytes != null)
  113. {
  114. for (int i = ; i < bytes.Length; i++)
  115. {
  116. returnStr += bytes[i].ToString("X2");
  117. }
  118. }
  119. return returnStr;
  120. }
  121.  
  122. /// <summary>
  123. /// 将16进制字符串转换为字节数组
  124. /// </summary>
  125. /// <param name="hexString"></param>
  126. /// <returns></returns>
  127. private static byte[] stringToHexByte(string hexString)
  128. {
  129. hexString = hexString.Replace(" ", "");
  130. if ((hexString.Length % ) != )
  131. hexString += " ";
  132. byte[] returnBytes = new byte[hexString.Length / ];
  133. for (int i = ; i < returnBytes.Length; i++)
  134. returnBytes[i] = Convert.ToByte(hexString.Substring(i * , ), );
  135. return returnBytes;
  136. }
  137.  
  138. #region 参数是byte[]类型的
  139. /// <summary>  
  140. /// AES加密 参数:byte[] 
  141. /// </summary>  
  142. /// <param name="source">源字符字节组</param>
  143. /// <param name="key">密钥</param>
  144. /// <param name="model">运算模式</param>
  145. /// <param name="padding">填充模式</param>
  146. /// <param name="encoding">编码类型</param>
  147. /// <returns>加密后的字符字节组</returns>  
  148. public static byte[] AesEncrypt(byte[] source, string key, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
  149. {
  150. if (source == null) return null;
  151. if (!AesCheckKey(key)) return source;
  152. if (encoding == null) encoding = Encoding.UTF8;
  153. byte[] bKey = encoding.GetBytes(key);
  154. byte[] cryptograph = null; //加密后的密文  
  155. Rijndael Aes = Rijndael.Create();
  156. Aes.Key = bKey;
  157. //开辟一块内存流  
  158. using (MemoryStream Memory = new MemoryStream())
  159. {
  160. //把内存流对象包装成加密流对象  
  161. using (CryptoStream Encryptor = new CryptoStream(Memory, Aes.CreateEncryptor(), CryptoStreamMode.Write))
  162. {
  163. //明文数据写入加密流  
  164. Encryptor.Write(source, , source.Length);
  165. Encryptor.FlushFinalBlock();
  166. cryptograph = Memory.ToArray();
  167. }
  168. }
  169. return cryptograph;
  170. }
  171.  
  172. /// <summary>  
  173. /// AES解密 参数:byte[] 
  174. /// </summary>  
  175. /// <param name="source">源字符字节组</param>
  176. /// <param name="key">密钥</param>
  177. /// <param name="model">运算模式</param>
  178. /// <param name="padding">填充模式</param>
  179. /// <param name="encoding">编码类型</param>
  180. /// <returns>解密后的字符字节组</returns>  
  181. public static byte[] AesDecrypt(byte[] source, string key, CipherMode model = CipherMode.ECB, PaddingMode padding = PaddingMode.PKCS7, Encoding encoding = null)
  182. {
  183. if (source == null) return null;
  184. if (!AesCheckKey(key)) return source;
  185. if (encoding == null) encoding = Encoding.UTF8;
  186. byte[] bKey = encoding.GetBytes(key);
  187. byte[] original = null; //解密后的明文  
  188. Rijndael Aes = Rijndael.Create();
  189. //开辟一块内存流,存储密文  
  190. using (MemoryStream Memory = new MemoryStream(source))
  191. {
  192. //把内存流对象包装成加密流对象  
  193. using (CryptoStream Decryptor = new CryptoStream(Memory, Aes.CreateDecryptor(bKey, null), CryptoStreamMode.Read))
  194. {
  195. //明文存储区  
  196. using (MemoryStream originalMemory = new MemoryStream())
  197. {
  198. byte[] Buffer = new byte[];
  199. int readBytes = ;
  200. while ((readBytes = Decryptor.Read(Buffer, , Buffer.Length)) > )
  201. {
  202. originalMemory.Write(Buffer, , readBytes);
  203. }
  204. original = originalMemory.ToArray();
  205. }
  206. }
  207. }
  208. return original;
  209. }
  210. #endregion
  211.  
  212. /// <summary>
  213. /// 对字符串SHA1加密
  214. /// </summary>
  215. /// <param name="source">源字符串</param>
  216. /// <param name="encoding">编码类型</param>
  217. /// <returns>加密后的十六进制字符串</returns>
  218. public static string Sha1Encrypt(string source, Encoding encoding = null)
  219. {
  220. if (encoding == null) encoding = Encoding.UTF8;
  221.  
  222. // 第一种方式
  223. byte[] byteArray = encoding.GetBytes(source);
  224. using (HashAlgorithm hashAlgorithm = new SHA1CryptoServiceProvider())
  225. {
  226. byteArray = hashAlgorithm.ComputeHash(byteArray);
  227. StringBuilder stringBuilder = new StringBuilder();
  228. foreach (byte item in byteArray)
  229. {
  230. stringBuilder.AppendFormat("{0:x2}", item);
  231. }
  232. hashAlgorithm.Clear();
  233. return stringBuilder.ToString();
  234. }
  235.  
  236. //// 第二种方式
  237. //using (SHA1 sha1 = SHA1.Create())
  238. //{
  239. // byte[] hash = sha1.ComputeHash(encoding.GetBytes(source));
  240. // StringBuilder stringBuilder = new StringBuilder();
  241. // for (int index = 0; index < hash.Length; ++index)
  242. // stringBuilder.Append(hash[index].ToString("x2"));
  243. // sha1.Clear();
  244. // return stringBuilder.ToString();
  245. //}
  246. }
  247.  
  248. /// <summary>
  249. /// 对字符串MD5加密
  250. /// </summary>
  251. /// <param name="source">源字符串</param>
  252. /// <param name="encoding">编码类型</param>
  253. /// <returns>加密后的十六进制字符串</returns>
  254. public static string Md5Encrypt(string source, Encoding encoding = null)
  255. {
  256. if (encoding == null) encoding = Encoding.UTF8;
  257.  
  258. byte[] byteArray = encoding.GetBytes(source);
  259. using (HashAlgorithm hashAlgorithm = new MD5CryptoServiceProvider())
  260. {
  261. byteArray = hashAlgorithm.ComputeHash(byteArray);
  262. StringBuilder stringBuilder = new StringBuilder();
  263. foreach (byte item in byteArray)
  264. {
  265. stringBuilder.AppendFormat("{0:x2}", item);
  266. }
  267. hashAlgorithm.Clear();
  268. return stringBuilder.ToString();
  269. }
  270. }

AES加密方式中关于PKCS5Padding与PKCS7Padding的区别

在PKCS5Padding中,明确定义Block的大小是8位,而在PKCS7Padding定义中,对于块的大小是不确定的,可以在1-255之间(块长度超出255的尚待研究),填充值的算法都是一样的:

value=k - (l mod k) ,K=块大小,l=数据长度,如果l=8, 则需要填充额外的8个byte的8

在.net中,例如TripleDESCryptoServiceProvider ,默认BlockSize=64bits=8bytes,所以在这种情况下在PKCS5Padding=PKCS7Padding。

如果在C#中自己定义了一个不是64bits的加密块大小,同时使用PKCS7Padding,那么在java中使用JDK标准的PKCS5Padding就不能解密了。

NET中各种加密解密方法的更多相关文章

  1. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  2. C#开发中常用加密解密方法解析

    一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是message-digest algorithm 5,简单的说就是单向的加密,即是说无法根据密文推 ...

  3. PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated

    直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...

  4. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

  5. .Net中的加密解密

    返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...

  6. ASP.NET常用加密解密方法

    ASP.NET常用加密解密方法 一.MD5加密解密 1.加密 C# 代码           public static string ToMd5(string clearString)        ...

  7. ios常见加密解密方法

    在其他平台中经常会计算MD5值,在iOS平台中也提供了该方法,首先需要导入头文件 #import <CommonCrypto/CommonDigest.h> 方法CC_MD5可以获取MD5 ...

  8. C#/IOS/Android通用加密解密方法

    原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密 ...

  9. OpenSSL 中 RSA 加密解密实现源代码分析

    1.RSA 公钥和私钥的组成.以及加密和解密的公式: 2.模指数运算: 先做指数运算,再做模运算.如 5^3 mod 7 = 125 mod 7 = 6 3.RSA加密算法流程: 选择一对不同的.而且 ...

随机推荐

  1. leetcode解题报告(27):Reverse Linked List

    描述 Reverse a singly linked list. 分析 一开始写的时候总感觉没抓到要点,然后想起上数据结构课的教材上有这道题,翻开书一看完就回忆起来了,感觉解法挺巧妙的,不比讨论区的答 ...

  2. 《挑战30天C++入门极限》新手入门:C++下的引用类型

        新手入门:C++下的引用类型 引用类型也称别名,它是个很有趣的东西.在c++ 下你可以把它看作是另外的一种指针,通过引用类型我们同样也可以间接的操作对象,引用类型主要是用在函数的形式参数上,通 ...

  3. ORA-01578: ORACLE 数据块损坏 (文件号 13, 块号 2415081) ORA-01110: 数据文件XXXXXX

    1.使用DBV检查数据文件,在cmd执行:dbv file='E:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF' blocksize=8192:然后等待检测结 ...

  4. note_4.10

    单位根反演 \[ \frac{1}{k}\sum_{i=0}^{k-1}\omega_k^{in}=[k|n] \] 所以 \[ \begin{equation} \begin{split} \sum ...

  5. finnal关键字修饰

    1.修饰变量,被赋值后不能被赋其他值,相当于常量 2.修饰方法,该方法不可以被子类重写,但可以重载 3.修饰类,修饰的类不可以被继承,如String,Math等

  6. 域渗透复盘(安洵CTF线下)

    复盘线下域渗透环境Write Up 0x01 外网web到DMZ进域 外网web入口 joomla应用   192.168.0.5 反序列化打下来 GET /index.php HTTP/1.1 Ho ...

  7. 2019UNCTF竞技赛部分writeup

    Reverse unctf_babyre2 这题flag分为两部分,第一部分每四个字符一组打包成int后,每次把四个int传入函数,后三个参数异或后先以每位为索引查表,将新数据进行循环移位.异或,将结 ...

  8. Ubuntu --- 安装deb包

    在Ubuntu下安装deb包需要使用dpkg命令.Dpkg 的普通用法: 1.sudo dpkg -i <package.deb> 安装一个 Debian 软件包,如你手动下载的文件. 2 ...

  9. python gdal ogr osgeo

  10. Visual Studio 2019更新到16.2.1

    Visual Studio 2019更新到16.2.1   此次更新,包含以下修改: (1)支持Xcode 10.3. (2)修复了Forms项目中,预览Android界面效果bug. (3)修复am ...