分享

C#(TripleDES)对应Java(3DES)加密工具类

 似水年华_1696 2020-03-07

C#(TripleDES)对应Java(3DES)加密工具类

原创 zhaowensky_126 最后发布于2014-10-14 11:48:50 阅读数 3433 收藏
发布于2014-10-14 11:48:50
分类专栏: C#基础
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    3DES又称Triple DES,是DES加密算法的一种模式,它使用3条56位的密钥对3DES数据进行三次加密。

    加密过程为:C=Ek3(Dk2(Ek1(P)))

    解密过程为:P=Dk1(EK2(Dk3(C)))

    C#已经对3DES加密进行了封装,可使用System.Security.Cryptography中的TripleDESCryptoServiceProvider类来实现,项目的需求是采用24位KEY、ECB模式来对应java平台的加解密。其中还涉及unix时间戳,MD5散列,base64编码的综合使用。

    开始的时候对HttpWebRequest认识不深,在对base64的编码“+”符号上犯错,POST与GET请求中“+”【%2B】会出现替换的不同,以至于平台解析不成功。以下是测试后的代码:

  1. using System;
  2. using System.Text;
  3. using System.Security.Cryptography;


  4. namespace TestProject
  5. {
  6. /// <summary>
  7. /// 数据加密工具类
  8. /// </summary>
  9. public sealed class EncryptionUtils
  10. {
  11. #region DES解密
  12. //3DES(DESede>Jave)24位KEY
  13. private const string ENCRYPT_KEY = "3DES_MD5_Timestamp123456";

  14. /// <summary>
  15. /// 3DES加密
  16. /// base64小细节,当使用get请求时,base64生成字符中有“+”号,
  17. /// 注意需要转换“%2B”,否则会被替换成空格。POST不存在
  18. /// while (str.IndexOf('+') != -1) {
  19. /// str = str.Replace("+","%2B");
  20. // }
  21. /// </summary>
  22. public static string Encrypt3DES (string fValue)
  23. {
  24. if(string.IsNullOrEmpty(fValue)){
  25. return fValue;
  26. }
  27. try{
  28. Encoding encoding = Encoding.GetEncoding("UTF-8");
  29. var DES = new TripleDESCryptoServiceProvider();
  30. DES.Key = encoding.GetBytes(ENCRYPT_KEY);
  31. DES.Mode = CipherMode.ECB;
  32. ICryptoTransform DESEncrypt = DES.CreateEncryptor();
  33. byte[] Buffer = encoding.GetBytes(fValue);
  34. return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
  35. }catch(Exception ex){
  36. Log.Error("Encrypt3DES>>"+ex.Message);
  37. return string.Empty;
  38. }
  39. }

  40. /// <summary>
  41. /// 3DES解密
  42. /// </summary>
  43. /// <returns>解密串</returns>
  44. /// <param name="a_strString">加密串</param>
  45. public static string Decrypt3DES (string a_strString)
  46. {
  47. if(string.IsNullOrEmpty(a_strString)){
  48. return a_strString;
  49. }
  50. try {
  51. var DES = new TripleDESCryptoServiceProvider ();
  52. DES.Key = ASCIIEncoding.ASCII.GetBytes (ENCRYPT_KEY);
  53. DES.Mode = CipherMode.ECB;
  54. DES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
  55. ICryptoTransform DESDecrypt = DES.CreateDecryptor ();
  56. byte[] Buffer = Convert.FromBase64String (a_strString);
  57. return ASCIIEncoding.ASCII.GetString (DESDecrypt.TransformFinalBlock (Buffer, 0, Buffer.Length));
  58. } catch (Exception e) {
  59. Log.Error("Decrypt3DES>>"+e.Message);
  60. return string.Empty;
  61. }
  62. }
  63. #endregion

  64. #region 基础方法
  65. /// <summary>
  66. /// MD5编码
  67. /// </summary>
  68. public static string MD5(string str){
  69. if(string.IsNullOrEmpty(str)){
  70. return str;
  71. }
  72. var md5 = new MD5CryptoServiceProvider();
  73. var datas = Encoding.UTF8.GetBytes(str);
  74. var hash = md5.ComputeHash(datas);
  75. md5.Clear();
  76. str = string.Empty;
  77. //把MD5所得用16进制小写的字符串形式,让函数返回一个32字节长的可打印字符串。
  78. for(int i =0;i<hash.Length;i++){
  79. str += hash[i].ToString("X").PadLeft(2,'0');
  80. }
  81. return str;
  82. }

  83. /// <summary>
  84. /// 并进行base64编码
  85. /// </summary>
  86. public static string ToBase64String(string str){
  87. if(string.IsNullOrEmpty(str)){
  88. return string.Empty;
  89. }
  90. return Convert.ToBase64String(Encoding.UTF8.GetBytes(str));
  91. }

  92. /// <summary>
  93. /// unix时间戳
  94. /// </summary>
  95. public static string GetTimestamp()
  96. {
  97. DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime (new System.DateTime (1970, 1, 1, 0, 0, 0, 0));
  98. DateTime nowTime = DateTime.Now;
  99. long unixTime = (long)Math.Round ((nowTime - startTime).TotalMilliseconds, MidpointRounding.AwayFromZero);
  100. return unixTime.ToString ();
  101. }
  102. #endregion
  103. }

  104. public static class Log
  105. {
  106. public static void Error(string msg)
  107. {
  108. Console.WriteLine ("Error"+msg);
  109. }

  110. public static void Info(string msg)
  111. {
  112. Console.WriteLine ("Info"+msg);
  113. }
  114. }
  115. }
测试代码:
  1. public static void Main (string[] args)
  2. {
  3. Console.WriteLine ("Hello World!");

  4. string line = string.Empty;
  5. while ((line = Console.ReadLine ()) != null) {
  6. var encrypt = EncryptionUtils.Encrypt3DES (line);
  7. var decrypt = EncryptionUtils.Decrypt3DES (encrypt);
  8. Log.Info ("输入>>" + line);
  9. Log.Info ("密文>>" + encrypt);
  10. Log.Info ("明文>>" + decrypt);
  11. }
  12. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多