在实际项目中,往往前端和后端使用不同的语言。比如使用C#开发客户端,使用Java开发服务器端。有时出于安全性考虑需要将字符加密传输后,由服务器解密获取。本文介绍一种采用DES算法的C#与Java同步加密解密的代码。

C#端代码:(注意:DES的秘钥采用8位字符)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Globalization;
  6. using System.Threading.Tasks;
  7. using System.Security.Cryptography;
  8. using System.IO;
  9. namespace ChatDemo.util
  10. {
  11. public static class PasswordHelper
  12. {
  13. ///<summary><![CDATA[字符串DES加密函数]]></summary>
  14. ///<param name="str"><![CDATA[被加密字符串 ]]></param>
  15. ///<param name="key"><![CDATA[密钥 ]]></param>
  16. ///<returns><![CDATA[加密后字符串]]></returns>
  17. public static string EncodeDES(string str, string key)
  18. {
  19. try
  20. {
  21. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  22. provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  23. provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  24. byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(str);
  25. MemoryStream stream = new MemoryStream();
  26. CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write);
  27. stream2.Write(bytes, 0, bytes.Length);
  28. stream2.FlushFinalBlock();
  29. StringBuilder builder = new StringBuilder();
  30. foreach (byte num in stream.ToArray())
  31. {
  32. builder.AppendFormat("{0:X2}", num);
  33. }
  34. stream.Close();
  35. return builder.ToString();
  36. }
  37. catch (Exception) { return "xxxx"; }
  38. }
  39. ///<summary><![CDATA[字符串DES解密函数]]></summary>
  40. ///<param name="str"><![CDATA[被解密字符串 ]]></param>
  41. ///<param name="key"><![CDATA[密钥 ]]></param>
  42. ///<returns><![CDATA[解密后字符串]]></returns>
  43. public static string DecodeDES(string str, string key)
  44. {
  45. try
  46. {
  47. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  48. provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  49. provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  50. byte[] buffer = new byte[str.Length / 2];
  51. for (int i = 0; i < (str.Length / 2); i++)
  52. {
  53. int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
  54. buffer[i] = (byte)num2;
  55. }
  56. MemoryStream stream = new MemoryStream();
  57. CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(), CryptoStreamMode.Write);
  58. stream2.Write(buffer, 0, buffer.Length);
  59. stream2.FlushFinalBlock();
  60. stream.Close();
  61. return Encoding.GetEncoding("UTF-8").GetString(stream.ToArray());
  62. }
  63. catch (Exception) { return ""; }
  64. }
  65. }
  66. }

Java端代码:

  1. package com.hbcloudwide.didaoa.chatserver.util;
  2. import javax.crypto.Cipher;
  3. import javax.crypto.SecretKey;
  4. import javax.crypto.SecretKeyFactory;
  5. import javax.crypto.spec.DESKeySpec;
  6. import javax.crypto.spec.IvParameterSpec;
  7. import org.apache.commons.codec.digest.DigestUtils;
  8. /**
  9. * 密码加密解密处理工具类
  10. *
  11. * @author lee
  12. *
  13. */
  14. public class PasswordUtil {
  15. // 解密数据
  16. /**
  17. * DES解密
  18. * @param message
  19. * @param key
  20. * @return
  21. * @throws Exception
  22. *
  23. * lee on 2016-12-26 00:28:18
  24. */
  25. public static String DecodeDES(String message, String key) throws Exception {
  26. byte[] bytesrc = convertHexString(message);
  27. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  28. DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
  29. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  30. SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
  31. IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
  32. cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
  33. byte[] retByte = cipher.doFinal(bytesrc);
  34. return new String(retByte);
  35. }
  36. /**
  37. * DES加密
  38. * @param message
  39. * @param key
  40. * @return
  41. * @throws Exception
  42. *
  43. * lee on 2016-12-26 00:28:28
  44. */
  45. public static byte[] EncodeDES(String message, String key) throws Exception {
  46. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  47. DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
  48. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  49. SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
  50. IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
  51. cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
  52. return cipher.doFinal(message.getBytes("UTF-8"));
  53. }
  54. /**
  55. * MD5加密
  56. * 使用org.apache.commons.codec.digest.DigestUtils加密
  57. * http://commons.apache.org/proper/commons-codec/download_codec.cgi
  58. * @param message
  59. * @return
  60. *
  61. * lee on 2016-12-26 00:28:28
  62. */
  63. public static String EncodeMD5(String message) {
  64. return DigestUtils.md5Hex(message);
  65. }
  66. public static byte[] convertHexString(String ss) {
  67. byte digest[] = new byte[ss.length() / 2];
  68. for (int i = 0; i < digest.length; i++) {
  69. String byteString = ss.substring(2 * i, 2 * i + 2);
  70. int byteValue = Integer.parseInt(byteString, 16);
  71. digest[i] = (byte) byteValue;
  72. }
  73. return digest;
  74. }
  75. public static String toHexString(byte b[]) {
  76. StringBuffer hexString = new StringBuffer();
  77. for (int i = 0; i < b.length; i++) {
  78. String plainText = Integer.toHexString(0xff & b[i]);
  79. if (plainText.length() < 2)
  80. plainText = "0" + plainText;
  81. hexString.append(plainText);
  82. }
  83. return hexString.toString();
  84. }
  85. }

C# DES加密后的字符传递到Java端获取后,可以正确进行解密。反之亦然。
BTW:Java代码中有一个方法用来进行MD5加密,采用org.apache.commons.codec.digest.DigestUtils进行加密。

C#与Java同步加密解密DES算法的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. 使用python进行加密解密AES算法

    使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...

  3. 重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类

    原文:重新想象 Windows 8 Store Apps (32) - 加密解密: 非对称算法, 数据转换的辅助类 [源码下载] 重新想象 Windows 8 Store Apps (32) - 加密 ...

  4. C# 实现 JAVA AES加密解密[原创]

    以下是网上普遍能收到的JAVA AES加密解密方法. 因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类.无法使用安全随机数生成KEY. 我们在接收J ...

  5. 【转】 java RSA加密解密实现

    [转] java RSA加密解密实现 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detai ...

  6. java字符串加密解密

    java字符串加密解密 字符串加密解密的方式很多,每一种加密有着相对的解密方法.下面要说的是java中模拟php的pack和unpack的字符串加密解密方法. java模拟php中pack: /** ...

  7. JAVA常用加密解密算法Encryption and decryption

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  8. JAVA加密解密DES对称加密算法

    下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子. 首先,生成一个密钥KEY. 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我们的类文件. ...

  9. JAVA实现RSA加密解密 非对称算法

    首先RSA是一个非对称的加密算法.所以在使用该算法加密解密之前,必须先行生成密钥对.包含公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实比例如以下: public stat ...

随机推荐

  1. 如何看一段JAVA代码耗了多少内存

    简单的方法,如下: Runtime r = Runtime.getRuntime();  r.gc();  long startMem = r.freememory(); // 开始时的剩余内存  你 ...

  2. Orchard之模版开发

    生成新模版之后(参看:Orchard之生成新模板),紧接着就是模版开发了. 一:开发必备之 Shape Tracing 到了这一步,非常依赖一个工具,当然,它也是 Orchard 项目本身的一个 Mo ...

  3. ASP.NET MVC:无法向会话状态服务器发出会话状态请求

    ylbtech-Error-ASP.NET MVC: 无法向会话状态服务器发出会话状态请求 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Service (ASP.NET ...

  4. xenapp 6.5 客户端插件第一次安装总是跳到官网

    部署完xenapp6.5后,在没有安装插件的客户端登录时,会出现“下载客户端插件”界面 其实网上已经有很多解决方案,大同小已,只是不知道为什么不适合我安装的版本而已.我安装时最新的版本xenapp 6 ...

  5. 原生JS实现bind()函数

    一.bind()函数的两个特性: 1.bind和curring,函数科里化 function add(a, b, c) { var i = a+b+c; console.log(i); return ...

  6. 使用numba加速python程序

    前面说过使用Cython来加速python程序的运行速度,但是相对来说程序改动较大,这次就说一种简单的方式来加速python计算速度的方法,就是使用numba库来进行,numba库可以使用JIT技术即 ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十六)Structured Streaming:WARN clients.NetworkClient: Error while fetching metadata with correlation id 1 : {my-topic=LEADER_NOT_AVAILABLE}

    问题描述: 我之前使用kafka的命令删除了改topic: ./kafka-topics.sh --delete --zookeeper [zookeeper server]  --topic [to ...

  8. Ajax:HyperText/URI, HTML, Javascript, frame, frameset, DHTML/DOM, iframe, XMLHttp, XMLHttpRequest

    本文内容 Ajax 诞生 促使 Ajax 产生的 Web 技术演化 真正 Ajax Ajax 与 Web 2.0 Ajax 背后的技术 2008 年毕业,2011 年看了<Ajax 高级程序设计 ...

  9. Office办公 如何给WPS 的文字添加黑框

    双击文本框,弹出的设置对象格式中选择线条颜色和样式即可   要做成虚线框也是可以的   弄完之后字体也可以改大一点   还有一种需要时文本不在黑框的中间位置,比如顶部的某个位置,可以设置文字锁定点是顶 ...

  10. Elasticsearch - 理解字段分析过程(_analyze与_explain)

    我们经常会遇到问题.为什么指定的文档没有被搜索到.许多情况下, 这都归因于映射的定义和分析例程配置存在问题. 针对分析过程的调试,ElasticSearch提供了专用的REST API. _analy ...