转自 microAllen
 
最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解密的时候,java进行DES加密一般都会写成如下:
public static byte[] encrypt(String message, String key) throws Exception {   
  Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
  // 密钥
  SecretKey secretKey = keyFactory.generateSecret(desKeySpec);   
  // 偏移量
  IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));   
  cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

return cipher.doFinal(message.getBytes("UTF-8"));   
}

因为初始化Cipher的时候设置了密钥和偏移量,所以C#的DESCryptoServiceProvider类可以很容易的进行解密。C#解密代码如下:
  public static string Decode(string str, string key)
  {
  try
  {

DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  // 密钥
  provider.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  // 偏移量
  provider.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8));
  byte[] buffer = new byte[str.Length / 2];
  for (int i = 0; i < (str.Length / 2); i++)
  {
  int num2 = Convert.ToInt32(str.Substring(i * 2, 2), 0x10);
  buffer[i] = (byte)num2;
  }
  MemoryStream stream = new MemoryStream();
  CryptoStream stream2 = new CryptoStream(stream, provider.CreateDecryptor(),CryptoStreamMode.Write);
  stream2.Write(buffer, 0, buffer.Length);
  stream2.FlushFinalBlock();
  stream.Close();
  return Encoding.GetEncoding("GB2312").GetString(stream.ToArray());
  }
  catch (Exception) { return ""; }
  }

现在的问题是java的DES加密不仅仅有上面一种写法,我需要解密的字符串是使用如下java代码进行加密的:
public static byte[] encrypt(String message, String key) throws Exception {
  SecureRandom sr = new SecureRandom();
  Cipher cipher = Cipher.getInstance("DES");

DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   
  SecretKey secretKey = keyFactory.generateSecret(desKeySpec);   
  // 这里使用的是另一个init方法
  cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);

return cipher.doFinal(message.getBytes("UTF-8"));   
}
这样的话,java加密的偏移量没有设置,而且通过测试发现就算上面设置了偏移量,Cipher cipher = Cipher.getInstance("DES");和Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 加密之后的结果也不一样,
所以这样的话使用C#解密的时候就不知道相应的偏移量应该怎么设置,麻烦各位高手指导一下,谢谢

问题补充:

DES加密解密结果一般要注意的地方:密钥、偏移量、块密码模式、填充模式
java DES加密的时候:
如果使用这种方式,Cipher cipher = Cipher.getInstance("DES"); 此时块密码模式用ECB模式,C#DES类默认模式是CBC模式,所以如果java使用上面的方式进行初始化的时候,使用C#解密的时候要记得设置Mode属性为ECB,另外,如果没有设置偏移量,C#解密的时候Key和IV设置成一样的就可以进行正常解密了。
所以对于上面java的第2种DES加密方法,使用C#解密的时候只需要在解密之前加上
provider.Mode = CipherMode.ECB;
就可以了

使用C# DES解密java DES加密的字符串的更多相关文章

  1. 记录新项目中遇到的技术及自己忘记的技术点【DES加密解密,MD5加密,字符串压缩、解压,字符串截取等操作】

    一.DES加密.解密 #region DES加密解密 /// <summary> /// 进行DES加密 /// </summary> /// <param name=& ...

  2. Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密

    Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...

  3. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

  4. 【知识积累】DES算法之C#加密&Java解密

    一.前言 在项目需要添加安全模块,客户端调用服务端发布的service必须要经过验证,加密算法采用DES,客户端采用C#进行加密,服务端使用Java进行解密.废话不多说,直接上代码. 二.客户端 客户 ...

  5. C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现

    这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ...

  6. C# Java DES加密解密

    转自http://www.cnblogs.com/zhuiyi/archive/2013/04/01/2993201.html 最近被DES加解密弄得超级郁闷,我用C#的方法加密得到的密文老是跟客户给 ...

  7. Java DES 加密和解密源码(转)

    原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...

  8. 加密解密工具类(Java,DES)

    一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...

  9. Java Des加解密方法(c#加密Java解密)

    最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...

随机推荐

  1. 将Android 工程从Windows导入到Ubuntu 下java类中的中文在ADT中乱码

    解决方法: 右键工程-->Properties->Resource->Text file encoding->Other 手动输入GBK ->点击OK (Other 中是 ...

  2. ural 1106 Two Teams

    http://acm.timus.ru/problem.aspx?space=1&num=1106 #include <cstdio> #include <cstring&g ...

  3. Android中的四层架构,五块区域

    1. Linux内核层Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动.音频驱动.照相机驱动.蓝牙驱动.Wi-Fi驱动.电源管理等.2 ...

  4. ALTIUM DESIGNER怎么定义差分对布线

    方法一:第一步是在原理图中声明,这样做的目的是为了让差分对布线器清楚哪两个网络是属于同一组差分对,设计编译器将查找格式为NETNAME_N和NETNAME_P(即以_N和_P为后缀)的两个同名网络.这 ...

  5. QQ音乐的请求

    CEF 3.2357.1291.g47e6d4bChromium 43.0.2357.134OS WindowsWebKit 537.36JavaScript 4.3.61.38Flash User ...

  6. static在实例Extends、Overload中理解

    在写java程序的时候只在类内部调用的方法定义为private的是个很好的编程习惯.另外子类的static方法和父类有同名.同参数的static方法,但他们之间没什么覆盖.继承的关系,你调用的时候看是 ...

  7. uboot之board.c源码分析

    /lib_arm/board.c 主要完成了一些初始化的操作,最重要的是有start_armboot函数 _armboot_start地址为多少?? /* * * U-Boot code: 00F00 ...

  8. delphi7调用webservice Java 传入参数为空

    在delphi7中,new-webservices-wsdl importer中输入wsdl地址,会自动生成wsdl单元代码.在调用时,传入参数到服务器端时为空了. 网上说缺少 InvRegistry ...

  9. SRM 586 DIV1

    A 考虑都是格点 , 枚举所有y+-0.5就行了. trick是避免正好在y上的点重复统计. class PiecewiseLinearFunction { public: int maximumSo ...

  10. 实现函数 isInteger(x) 来判断 x 是否是整数

    将x转换为十进制整数,判断是否和自身相等即可: function isInteger(x){ return parseInt(x, 10) === x; } console.log('1.2 is a ...