一、DES加解密

  DES一共就有4个参数参与运作:明文、密文、密钥、向量。其中这4者的关系可以理解为:

  •   密文=明文+密钥+向量;
  •   明文=密文-密钥-向量;

  为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!

  下面给出DES加、解密的.Net封装版:

  1. using System;
  2. using System.Text;
  3. using System.Security.Cryptography;
  4. using System.IO;
  5.  
  6. namespace 开发测试
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. string user = Encrypt("admin");
  13. string pass = Encrypt("999999");
  14.  
  15. Console.WriteLine(user);
  16. Console.WriteLine(pass);
  17.  
  18. string GetUser = Decrypt(user);
  19. string GetPass = Decrypt(pass);
  20.  
  21. Console.WriteLine(GetUser);
  22. Console.WriteLine(GetPass);
  23.  
  24. Console.ReadLine();
  25. }
  26.  
  27. /// <summary>
  28. /// 获取密钥
  29. /// </summary>
  30. private static string Key
  31. {
  32. get { return @"P@+#wG%A"; }
  33. }
  34.  
  35. /// <summary>
  36. /// 获取向量
  37. /// </summary>
  38. private static string IV
  39. {
  40. get { return @"L*n67}G\Mk@k%:~Y"; }
  41. }
  42.  
  43. /// <summary>
  44. /// DES加密
  45. /// </summary>
  46. /// <param name="plainStr">明文字符串</param>
  47. /// <returns>密文</returns>
  48. public static string Encrypt(string plainStr)
  49. {
  50. byte[] bKey = Encoding.UTF8.GetBytes(Key);
  51. byte[] bIV = Encoding.UTF8.GetBytes(IV);
  52. byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
  53.  
  54. string encrypt = null;
  55. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  56. try
  57. {
  58. using (MemoryStream mStream = new MemoryStream())
  59. {
  60. using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
  61. {
  62. cStream.Write(byteArray, 0, byteArray.Length);
  63. cStream.FlushFinalBlock();
  64. encrypt = Convert.ToBase64String(mStream.ToArray());
  65. }
  66. }
  67. }
  68. catch { }
  69. des.Clear();
  70. return encrypt;
  71. }
  72.  
  73. /// <summary>
  74. /// DES解密
  75. /// </summary>
  76. /// <param name="encryptStr">密文字符串</param>
  77. /// <returns>明文</returns>
  78. public static string Decrypt(string encryptStr)
  79. {
  80. byte[] bKey = Encoding.UTF8.GetBytes(Key);
  81. byte[] bIV = Encoding.UTF8.GetBytes(IV);
  82. byte[] byteArray = Convert.FromBase64String(encryptStr);
  83.  
  84. string decrypt = null;
  85. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  86. try
  87. {
  88. using (MemoryStream mStream = new MemoryStream())
  89. {
  90. using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
  91. {
  92. cStream.Write(byteArray, 0, byteArray.Length);
  93. cStream.FlushFinalBlock();
  94. decrypt = Encoding.UTF8.GetString(mStream.ToArray());
  95. }
  96. }
  97. }
  98. catch { }
  99. des.Clear();
  100. return decrypt;
  101. }
  102. }
  103. }

二、AES加解密

  AES是美国联邦政府采用的商业及政府数据加密标准,预计将在未来几十年里代替DES在各个领域中得到广泛应用。AES提供128位密钥,因此,128位AES的加密强度是56位DES加密强度的1021倍还多。假设可以制造一部可以在1秒内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。

  下面给出AES加解密的.Net封装版:

  1. using System;
  2. using System.Text;
  3. using System.Security.Cryptography;
  4. using System.IO;
  5.  
  6. namespace 开发测试
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. string user = Encrypt("admin");
  13. string pass = Encrypt("999999");
  14.  
  15. Console.WriteLine(user);
  16. Console.WriteLine(pass);
  17.  
  18. string GetUser = Decrypt(user);
  19. string GetPass = Decrypt(pass);
  20.  
  21. Console.WriteLine(GetUser);
  22. Console.WriteLine(GetPass);
  23.  
  24. Console.ReadLine();
  25. }
  26.  
  27. /// <summary>
  28. /// 获取密钥
  29. /// </summary>
  30. private static string Key
  31. {
  32. get { return @"qO[NB]6,YF}gefcaj{+oESb9d8>Z'e9M"; }
  33. }
  34.  
  35. /// <summary>
  36. /// 获取向量
  37. /// </summary>
  38. private static string IV
  39. {
  40. get { return @"L+\~f4.Ir)b$=pkf"; }
  41. }
  42.  
  43. /// <summary>
  44. /// AES加密
  45. /// </summary>
  46. /// <param name="plainStr">明文字符串</param>
  47. /// <returns>密文</returns>
  48. public static string Encrypt(string plainStr)
  49. {
  50. byte[] bKey = Encoding.UTF8.GetBytes(Key);
  51. byte[] bIV = Encoding.UTF8.GetBytes(IV);
  52. byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
  53.  
  54. string encrypt = null;
  55. Rijndael aes = Rijndael.Create();
  56. try
  57. {
  58. using (MemoryStream mStream = new MemoryStream())
  59. {
  60. using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
  61. {
  62. cStream.Write(byteArray, 0, byteArray.Length);
  63. cStream.FlushFinalBlock();
  64. encrypt = Convert.ToBase64String(mStream.ToArray());
  65. }
  66. }
  67. }
  68. catch { }
  69. aes.Clear();
  70.  
  71. return encrypt;
  72. }
  73.  
  74. /// <summary>
  75. /// AES解密
  76. /// </summary>
  77. /// <param name="encryptStr">密文字符串</param>
  78. /// <returns>明文</returns>
  79. public static string Decrypt(string encryptStr)
  80. {
  81. byte[] bKey = Encoding.UTF8.GetBytes(Key);
  82. byte[] bIV = Encoding.UTF8.GetBytes(IV);
  83. byte[] byteArray = Convert.FromBase64String(encryptStr);
  84.  
  85. string decrypt = null;
  86. Rijndael aes = Rijndael.Create();
  87. try
  88. {
  89. using (MemoryStream mStream = new MemoryStream())
  90. {
  91. using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
  92. {
  93. cStream.Write(byteArray, 0, byteArray.Length);
  94. cStream.FlushFinalBlock();
  95. decrypt = Encoding.UTF8.GetString(mStream.ToArray());
  96. }
  97. }
  98. }
  99. catch { }
  100. aes.Clear();
  101.  
  102. return decrypt;
  103. }
  104. }
  105. }

三、MD5与SHA128、256...散列

  MD5和SHA1散列通常被用于密码中,很多人称其为散列算法,实际上它正确应该叫做散列算法。散列是不可逆的,也就是没有了"解密"这个说法。

  下面给出MD5与SHA128散列的.Net的System.Web快速实现版:

  1. using System;
  2. using System.Text;
  3. using System.IO;
  4.  
  5. namespace 开发测试
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. string user = MD5("admin");
  12. string pass = MD5("999999");
  13.  
  14. Console.WriteLine(user);
  15. Console.WriteLine(pass);
  16.  
  17. string user2 = SHA1("admin");
  18. string pass2 = SHA1("999999");
  19.  
  20. Console.WriteLine(user2);
  21. Console.WriteLine(pass2);
  22.  
  23. Console.ReadLine();
  24. }
  25.  
  26. //32位大写MD5散列
  27. public static string MD5(string str)
  28. {
  29. return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToUpper();
  30. }
  31.  
  32. //大写SHA1散列
  33. public static string SHA1(string str)
  34. {
  35. return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToUpper();
  36. }
  37. }
  38. }

  全面版:

  1. using System;
  2. using System.Text;
  3. using System.IO;
  4. using System.Security.Cryptography;
  5.  
  6. namespace 开发测试
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. string user = MD5("admin");
  13. string pass = MD5("999999");
  14.  
  15. Console.WriteLine(user);
  16. Console.WriteLine(pass);
  17.  
  18. string user2 = SHA128("admin");
  19. string pass2 = SHA128("999999");
  20.  
  21. Console.WriteLine(user2);
  22. Console.WriteLine(pass2);
  23.  
  24. string user3 = SHA256("admin");
  25. string pass3 = SHA256("999999");
  26.  
  27. Console.WriteLine(user3);
  28. Console.WriteLine(pass3);
  29.  
  30. string user4 = SHA384("admin");
  31. string pass4 = SHA384("999999");
  32.  
  33. Console.WriteLine(user4);
  34. Console.WriteLine(pass4);
  35.  
  36. string user5 = SHA512("admin");
  37. string pass5 = SHA512("999999");
  38.  
  39. Console.WriteLine(user5);
  40. Console.WriteLine(pass5);
  41.  
  42. Console.ReadLine();
  43. }
  44.  
  45. //16字节,128位
  46. public static string MD5(string str)
  47. {
  48. byte[] buffer = Encoding.UTF8.GetBytes(str);
  49. MD5CryptoServiceProvider MD5 = new MD5CryptoServiceProvider();
  50. byte[] byteArr = MD5.ComputeHash(buffer);
  51. return BitConverter.ToString(byteArr);
  52. }
  53.  
  54. //20字节,160位
  55. public static string SHA128(string str)
  56. {
  57. byte[] buffer = Encoding.UTF8.GetBytes(str);
  58. SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
  59. byte[] byteArr = SHA1.ComputeHash(buffer);
  60. return BitConverter.ToString(byteArr);
  61. }
  62.  
  63. //32字节,256位
  64. public static string SHA256(string str)
  65. {
  66. byte[] buffer = Encoding.UTF8.GetBytes(str);
  67. SHA256CryptoServiceProvider SHA256 = new SHA256CryptoServiceProvider();
  68. byte[] byteArr = SHA256.ComputeHash(buffer);
  69. return BitConverter.ToString(byteArr);
  70. }
  71.  
  72. //48字节,384位
  73. public static string SHA384(string str)
  74. {
  75. byte[] buffer = Encoding.UTF8.GetBytes(str);
  76. SHA384CryptoServiceProvider SHA384 = new SHA384CryptoServiceProvider();
  77. byte[] byteArr = SHA384.ComputeHash(buffer);
  78. return BitConverter.ToString(byteArr);
  79. }
  80.  
  81. //64字节,512位
  82. public static string SHA512(string str)
  83. {
  84. byte[] buffer = Encoding.UTF8.GetBytes(str);
  85. SHA512CryptoServiceProvider SHA512 = new SHA512CryptoServiceProvider();
  86. byte[] byteArr = SHA512.ComputeHash(buffer);
  87. return BitConverter.ToString(byteArr);
  88. }
  89. }
  90. }

C# DES_AES_MD5_加密_解密的更多相关文章

  1. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  2. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  3. DES加密和解密PHP,Java,ObjectC统一的方法

    原文:DES加密和解密PHP,Java,ObjectC统一的方法 PHP的加解密函数 <?php class DesComponent { var $key = '12345678'; func ...

  4. C#操作Word文档(加密、解密、对应书签插入分页符)

    原文:C#操作Word文档(加密.解密.对应书签插入分页符) 最近做一个项目,客户要求对已经生成好的RTF文件中的内容进行分页显示,由于之前对这方面没有什么了解,后来在网上也找了相关的资料,并结合自己 ...

  5. 前端AES的加密和解密

    在工作的过程中,经常要对一些数据做一些加密,当然有复杂的加密和简单的加密,也有对称加密等等.总之加密的方式有很多.今天在这里,我只是简单的分享一个我最近遇到的加密方式-AES.这个也是后端工程师用的, ...

  6. JavaScript前端和Java后端的AES加密和解密

    在实际开发项目中,有些数据在前后端的传输过程中需要进行加密,那就需要保证前端和后端的加解密需要统一.这里给大家简单演示AES在JavaScript前端和Java后端是如何实现加密和解密的. 直接上代码 ...

  7. mcrypt加密以及解密过程

    Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示 Mcrypt扩展库可以实现加密解密功能 ...

  8. url加密和解密

    .NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...

  9. 常见的加密和解密算法—BASE64

    一.BASE64加密和解密概述 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系 ...

随机推荐

  1. bzoj1004 Cards

    Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红 ...

  2. 【转帖】.Net中C#的DllImport的用法

    在 C# 中通过 P/Invoke 调用Win32 DLL http://msdn.microsoft.com/zh-cn/library/aa686045.aspx   大家在实际工作学习C#的时候 ...

  3. 在CentOS上安装FFMPEG和Gstream-ffmpeg

    当我们用CentOS7自带的源时,是yum search不到标题上述的两个相关的包的,而opencv需要用到FFmpeg读取视频文件.这就必须安装了. 可以参考FFMPEG官方给出的文档: http: ...

  4. MySQL库表状态查询

    一. 查看库的各链接状态 对于一个mysql连接或者一个线程,任何时刻都有一个状态,表示其当前正在做什么.一般使用show full processlist查看. +---------+------- ...

  5. Oracle ORA-03137: TTC protocol internal error : [12333] 故障分析

    程序通过JDBC 连接数据库异常,报 ORA-03137[12333]的错误. 当前程序的JDBC 驱动版本:ojdbc16-11.2.0.1.0.jar 数据库版本: 11.2.0.3 一. Log ...

  6. Sans Serif 与 Serif 字体是什么意思?

    在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和 Serif,打字机体虽然也属于 Sans Serif,但由于是等宽字体,所以另外独立出 Monospace 这一种类,例如在Web中 ...

  7. cf446A DZY Loves Sequences

    A. DZY Loves Sequences time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. Maven中pom.xml常用元素说明

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. hdoj 3400 三分

    两次三分 #include <iostream> #include <cstdio> #include <cstring> #include <cmath&g ...

  10. NO.14 两个div并排,左边为绝对宽度,右边为相对宽度

    两个div并排,左边为绝对宽度,右边为相对宽度,这个问题,我也经常遇到,我一般的处理方法是将最大的容器padding-left固定宽度,左边的固定宽度的一块position:absolute,然后ri ...